2017-09-22 14 views
-1

これは私が起こっていないことを期待しているものなので、ここから助けが必要です。アプリが閉鎖された後にアプリケーションがクラッシュする

私のアプリケーションでは、(2)2-3秒かかるかもしれないAsyncTaskを実行します。そのAsyncTaskでは、UIコントロールの値をほとんど更新しないrunOnUiThread()があります。

アクティビティのfinish()を行う[サインアウト]ボタンをクリックするまで、これは正常に機能します。

findViewByIdがnullを返すNULLポインタ例外が発生しました。更新前にヌルチェックを追加することはできますが、使用されるUI画面とAsyncTaskの量を考慮すると、私は膨大な数のチェックに終わるでしょう。

このケースに最適な解決策は何ですか? 問題は、AsyncTaskの完了とfinish()の呼び出しとの間に時間差が正確に一致している場合にのみ発生します。

+0

asyncが実行されているときにアプリケーションを終了すると、それが表示されます。私は私を助けるためにブールを使った。私は、アクティビティの作成時にfalseに設定します。私はpreの間にtrueに設定し、投稿のすべてが完了した後にfalseに設定します。私はそれを呼び出すとき。 – DroiDev

答えて

0

AsyncTaskのdoInBackground()から進捗を更新するためにrunOnUiThread()メソッドを呼び出さないようにしてください。これには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

関連する問題