非同期タスクを持ち、いくつかの異なるサービスから呼び出され、これらのサービスが定期的に実行される方法があります。私は、あるタスクが進行中であることを確かめたいのですが、タスクが終了しない限り他のタスクは呼び出せません。非同期タスクが一度だけ呼び出されるようにする方法
答えて
public class Helper {
public static void doSomethingAsync() {
new AsyncTask<String, Void, Integer>() {
@Override
protected void onPreExecute() {
}
@Override
protected Integer doInBackground(String... strings) {
//doing something
}
@Override
protected void onPostExecute(Integer resultCode) {
}
}.execute();
}
public static void someOtherMethod(){
}
}
AsyncTask.getStatus()
が終了か否か、すなわち、タスクのステータスを与えます。
メンバ変数を宣言し
private static AsyncTask<String, Void, Integer> mTask;
public static void doSomethingAsync() {
if(null != mTask && mTask.getStatus() != AsyncTask.Status.FINISHED){
return; //Returning as the current task execution is not finished yet.
}
mTask = new AsyncTask<String, Void, Integer>() {
@Override
protected void onPreExecute() {
}
@Override
protected Integer doInBackground(String... strings) {
//doing something
}
@Override
protected void onPostExecute(Integer resultCode) {
}
};
mTask.execute();
}
は、すべてのサービスは、アプリケーション全体でアクセスすることができ、同じMutexへのアクセス権を持っていることを確認し、としてあなたの方法を変更します。非同期タスクにアクセスする前に今すぐ
、その後、として使用することができ
public class Mutex {
public void acquire() throws InterruptedException { }
public void release() { }
public boolean attempt(long msec) throws InterruptedException { }
}
次のように実行します。
try {
mutex.acquire();
try {
// do something
} finally {
mutex.release();
}
} catch(InterruptedException ie) {
// ...
}
アンドロイドでhere
上で詳細をチェックします我々はSemaphoreを持っています。これについては、以下を
java.util.concurrent.Semaphore semaphore=new Semaphore(1);
boolean isAvailable = semaphore.tryAcquire();
if(isAvailable){
// Access AsyncTask
}
は一旦全てのアクションが行われている手順になり、onPostExecute
semaphore.release();
ありがとう、代わりのアプローチ、私はそれを試してみましょう。 – mSapps
まであなたが「doSomethingAsync()」として同期方法せることによって、これを試すことができます。
public synchronized static void doSomethingAsync() {
new AsyncTask<String, Void, Integer>() {
@Override
protected void onPreExecute() {
}
@Override
protected Integer doInBackground(String... strings) {
//doing something
}
@Override
protected void onPostExecute(Integer resultCode) {
}
}.execute();
}
注:「ではなく、インスタンスのクラス」:ではなく、オブジェクトのクラスをロックし、それがキーワード静的意味するので、クラスをロックします
静的な同期メソッド。キーワードsynchronizedは、一度に1つのスレッドだけがメソッドにアクセスできることを意味します。 これは、「一度に1人だけがクラスにアクセスできます」という意味です。
ご回答ありがとうございます、私は自分の質問を編集しました。ご覧のとおり、私はそのクラスにいくつかのメソッドがあります。あなたは '一度に一つしかクラスにアクセスできない 'と言っていたので、私の質問は、非同期タスクが実行されている間、このクラスの他のメソッドをアクセス不能にするでしょうか? – mSapps
@mSapps:そのクラスの他のメソッドには、あなたが今どこからでも "doSomethingAsync()"が何かをブロックすることはありません。 –
2つのサービスが実行されているとします。 Service1はdoSomethingAsync()メソッドにアクセスする機会を得て、その間にservice2はdoSomethingAsync()を呼び出そうとしますが、ロックはサービス1のスレッドによって既に獲得されているためアクセスはできません。そして、サービス2がdoSomethingAsync()に再びアクセスする機会を得た後、service1がそのロックを解放すると、それが理にかなってほしい。 –
が、これはあなたが同期の概念を参照する必要があり
をキューイングし、バックグラウンドスレッドで実行するサポートとして、それはuのを助ける代わりにIntentServiceを使用してみてください。
Link
- 1. Node.jsスタイルコールバックが一度だけ呼び出されるようにする方法
- 2. 非同期タスクを呼び出す
- 3. 非同期タスクメソッド呼び出しが同期的に実行されるようにする方法
- 4. 非同期タスクでif文を呼び出す方法は?
- 5. qpid陽子on_sendableが一度だけ呼び出される
- 6. C#PowerShellを非同期に呼び出すが、モジュールを一度だけインポートする
- 7. 非同期タスクメソッドが同時に呼び出されるのを防ぐ方法
- 8. 非同期呼び出しを同期化する方法
- 9. 非同期呼び出しが一度も実行されない
- 10. Xamarin Androidが非同期で非同期に呼び出される
- 11. 角度 - HttpInterceptor +非同期呼び出し
- 12. 同期呼び出し内での非同期タスクの実行
- 13. @Scheduleメソッドを一度に1回だけ呼び出す方法
- 14. Android - サービス - 開始コマンドで一度だけ呼び出される
- 15. OnDraw()はループ後に一度だけ呼び出されます
- 16. イベントのディスパッチャは一度だけ呼び出されますC#
- 17. Windowsフックは一度だけ呼び出されます
- 18. Loader:onLoadFinishedは一度だけ呼び出されます
- 19. DependencyProperties:PropertyChangedCallBackは一度だけ呼び出されます
- 20. Androidサービスクラス - OnCreateは一度だけ呼び出されます
- 21. Angular2:setTimeoutは一度だけ呼び出されます
- 22. RecyclerView.onBindViewHolderは一度だけ呼び出されます
- 23. ディレクティブは一度だけ呼び出されます
- 24. Android:FastScrolling SectionIndexer getSections()は一度だけ呼び出されます
- 25. BluetoothGattCallBack関数onCharacteristicReadは一度だけ呼び出されます
- 26. AuthorizeAttributeは一度だけ呼び出されます
- 27. heightForHeaderInSectionは一度だけ呼び出されます
- 28. 非同期タスクを使用してWebサービスが呼び出されない
- 29. ASP.NET Webフォーム - 非同期的にWCF非同期メソッドを呼び出す方法
- 30. 非同期呼び出し内の非同期呼び出しが実行されない
ご回答いただきありがとうございます。解決策を試しましたが、クラッシュしています。 'java.lang.ClassCastException:java.lang.Object []は' private static AsyncTask mTask'のjava.lang.String [] 'にキャストできませんこの行 – mSapps
私は自分の答えを修正しました。宣言はAsyncTaskでなければなりません。この変更を試してください –
VishnuSP