2017-09-22 187 views
-1

这是我期望不会发生的事情,因此我需要从这里获得帮助。我的应用程序关闭后应用程序崩溃

在我的应用程序中,我执行()一个AsyncTask,可能需要不到2-3秒。在那个AsyncTask中,我有runOnUiThread(),它更新了很少的UI控件值。

这工作正常,直到,如果我做点击注销按钮,完成()的活动。

我得到空指针异常,findViewById返回null。我可以在更新之前添加空检查,但考虑到UI屏幕和AsyncTasks的使用数量,我最终会进行大量检查。

这种情况的最佳解决方案是什么? 仅当AsyncTask完成和调用finish()之间的时间差确切重合时才会发生问题。

+0

如果你在异步运行时关闭应用程序,你会得到。我用了一个布尔来帮助我。我在创建活动时将其设置为false。我在pre中设置为true,并在post后的所有内容完成后将其设置为false。当我打电话时。我做,如果(!运​​行){新.execute()}其他{}似乎修复我 – DroiDev

回答

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运行。

+0

我不打算更新进度,一旦我完成我的AsyncTask我的网络交互我试图更新UI字段的值。 – harshal