這將更加有助於你花一點點時間瞭解一個AsyncTask
比別人來簡單地讓一個適合你的架構。
AsyncTask實際上是一個相當簡單的類來擴展和使用。 AsyncTask最簡單的形式可以是在後臺運行的代碼(離開UI線程 - 這是導致鎖定的原因),但是它被設置爲允許一些代碼在後臺運行,一些代碼需要在後臺運行/之後,並根據需要執行一些代碼作爲進度更新。
您需要創建自己的類來擴展AsyncTask,如下所示。你的任務將需要三個參數。第一個會傳入在後臺運行的doInBackground
函數,第二個是可以傳遞到進度更新函數的參數的類型,第三個是要傳遞到您的onPostExecute
fn的類型,該類型運行在後臺功能完成後的UI線程。在下面的簡單示例中,我將不包含要傳遞給post執行函數或進度更新函數的類型,因此它們將是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並使用方法分析來完成此操作。另一種方法是使用Debug
類,並在要開始時撥打Debug.startMethodTracing("tracefilename");
,並撥打Debug.stopMethodTracing();
。你可以read more about that here。但是,您的代碼確實加載了一個url(mWebView.loadUrl
),所以我認爲這可能是一個很大的瓶頸!
只是作爲附錄,如果你想在一個的AsyncTask的深度例如更多信息,下面是一個IC &鈀from this useful documentation:
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線程運行後執行fn使用該參數。
如果我只需要airpush服務在後臺完成我應該怎麼做?我是一個初學者容忍我:( – 2013-03-16 23:52:49
我不熟悉airpush,但如果它需要網絡連接,那麼你可以在'doInBackground()'中做到這一點,如果你想要它返回'UI'或任何其他結果因此,你只需將這些結果傳遞給'onPostExecute()',而不需要'AsyncTask'的其他方法。只要你正在嘗試,而不只是尋找某人編寫代碼,我就可以容忍你。不得不在某處開始,所以不要擔心:) – codeMagic 2013-03-17 00:09:03
在「返回某些東西」中,我應該放什麼東西而不是東西? – 2013-03-17 00:12:29