这是我希望不会发生的事情,因此我需要从这里获得帮助。
在我的应用程序中,我执行()一个AsyncTask,可能需要不到2-3秒。在那个AsyncTask中,我有runOnUiThread(),它可以更新几个UI控件值。
如果我单击“注销”按钮执行活动的结束(),则此工作正常。
我得到Null指针异常,findViewById返回null。我可以在更新之前添加空检查,但考虑到UI屏幕和使用的AsyncTasks的数量,我最终将进行大量检查。
这种情况的最佳解决方案是什么? 仅当与AsyncTask完成和调用finish()之间的时间差异完全一致时才会发生问题。
答案 0 :(得分:0)
避免调用runOnUiThread()方法来更新AsyncTask的doInBackground()中的进度。你有onProgressUpdate()。以下是如何在AsyncTask中调用此方法的基本示例:
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");
}
}
请记住,在AsyncTask中,只有一个方法在后台线程上运行 - doInBackground(),其余方法在MainThread上运行。