アクティビティを終了する直前に、2 つの非同期タスク (サーバー リクエストを実行するタスク) を実行しています。この非同期タスクを実行するアクティビティは、非同期タスクが完了するまでスタックする場合があり、次のアクティビティが表示され、非同期タスクが完了するまでスタックする場合があります。
私の質問は、アクティビティの UI がスタックしないようにこのタスクを実行する方法です (UI は非同期タスクの応答に依存しません)。
アクティビティを終了する直前に、2 つの非同期タスク (サーバー リクエストを実行するタスク) を実行しています。この非同期タスクを実行するアクティビティは、非同期タスクが完了するまでスタックする場合があり、次のアクティビティが表示され、非同期タスクが完了するまでスタックする場合があります。
私の質問は、アクティビティの UI がスタックしないようにこのタスクを実行する方法です (UI は非同期タスクの応答に依存しません)。
これを試すことができますか。
AsyncTask.get()
アクティビティ コードのどこかで呼び出している可能性があります。タスクの実行が完了する前に呼び出すと、タスクが完了するまで待機します (したがって、UI が動かなくなります)。
だけにコードを書いてAsyncTask
doInBackground()
呼び出します。UIにアクセスしているかどうかを確認できるようにします。
例えば:TestAsync extends AsyncTask...
TestAsync async = new TestAsync();
async.execute();
これを試して。通常、AsyncTask
別のスレッドで実行する必要があります。2 つのインスタンスを作成する場合。そしてexecuteを呼び出します。独立して実行する必要があります。ただし、使用可能なスレッドが 1 つしかない可能性があるため、待機する必要があります (下位バージョンでは、プール サイズは 1 です)。
@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11
void startMyTask(AsyncTask asyncTask) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
else
asyncTask.execute(params);
}
他の方法は、通常のスレッドで実行する必要があります。
onPostExecute()
最初の非同期タスクで次のアクティビティを開始してください。また、新しいアクティビティに非同期タスクがある場合は、onCreate メソッドの最後の項目として呼び出します。これらの簡単なルールに従うと役立つはずです