AsyncTask
誰かがあなたのために単純にアーキテクチャを作成するよりも、アーキテクチャを理解するために少し時間を費やす方がはるかに役立ちます。
AsyncTaskは、実際には拡張して使用するための非常に単純なクラスです。AsyncTaskは、最も単純な形式では、バックグラウンドで実行されるコード(UIスレッドから外れる-これがロックアップの原因です)である可能性がありますが、一部のコードをバックグラウンドで実行し、一部のコードを前に実行できるように設定されています/ after、および必要に応じて進行状況の更新として実行するコード。
以下に示すように、AsyncTaskを拡張する独自のクラスを作成する必要があります。タスクは3つのパラメーターを取ります。1つ目はバックグラウンドで実行される関数に渡されdoInBackground
、2つ目は進行状況更新関数に渡すことができるパラメーターのタイプであり、3つ目はonPostExecute
UIスレッドで実行されるfnに渡されるタイプです。バックグラウンド機能が完了した後。以下の簡単な例では、実行後関数または進行状況更新関数に渡される型を含めないため、それらはVoid型になります。
private class YourTask extends AsyncTask<byte[], Void, Void> {
protected Long doInBackground(byte[]... data) {
//get the array
byte[] array = data[0];
//do something with it.
HERE IS WHERE YOU RUN YOUR CODE IN THE BACKGROUND THAT IS TAKING TOO LONG ON THE UI THREAD
//return null because this type needs to match the last type for returning to the postexec fn
return null;
}
}
タスクを実行する場合は、次のように呼び出します。
new YourTask().execute(someByteArray);
そのため、多くの場合、時間のかかるコードをその関数に貼り付けることができdoInBackground
ますが、UIスレッドから外れており、一部のコードはUIスレッドで実行する必要があるため、注意が必要です。
プロファイリングを実行して、具体的にどのコードがUIスレッドを詰まらせているかを確認し、AsyncTaskを使用してバックグラウンドでそれを実行することをお勧めします。これを行うには、EclipseでDDMSを使用し、メソッドプロファイリングを使用します。もう1つの方法は、Debug
クラスを使用して、Debug.startMethodTracing("tracefilename");
開始するときに呼び出すことですDebug.stopMethodTracing();
。あなたはここでそれについてもっと読むことができます。ただし、コードはurl(mWebView.loadUrl
)をロードするので、これが大きなボトルネックになる可能性があると思います。
補遺と同じように、AsyncTaskのより詳細な例が必要な場合は、この便利なドキュメントからのI C&Pdを次に示します。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
上記の例には、バックグラウンドタスク中のUIの更新の進行状況を例示するコードと、UIスレッドを実行するpostexecutefnで使用されるパラメーターを渡すコードの両方が含まれています。