我的应用程序关闭后应用程序崩溃
问题描述:
这是我期望不会发生的事情,因此我需要从这里获得帮助。我的应用程序关闭后应用程序崩溃
在我的应用程序中,我执行()一个AsyncTask,可能需要不到2-3秒。在那个AsyncTask中,我有runOnUiThread(),它更新了很少的UI控件值。
这工作正常,直到,如果我做点击注销按钮,完成()的活动。
我得到空指针异常,findViewById返回null。我可以在更新之前添加空检查,但考虑到UI屏幕和AsyncTasks的使用数量,我最终会进行大量检查。
这种情况的最佳解决方案是什么? 仅当AsyncTask完成和调用finish()之间的时间差确切重合时才会发生问题。
答
避免调用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运行。
+0
我不打算更新进度,一旦我完成我的AsyncTask我的网络交互我试图更新UI字段的值。 – harshal
如果你在异步运行时关闭应用程序,你会得到。我用了一个布尔来帮助我。我在创建活动时将其设置为false。我在pre中设置为true,并在post后的所有内容完成后将其设置为false。当我打电话时。我做,如果(!运行){新.execute()}其他{}似乎修复我 – DroiDev