解決しようとしているアプリで非常に散発的なエラーが発生します。アプリに入ると、ある時点でメイン UI スレッドの処理が終了し、制御をバックグラウンド スレッドに渡してデータを取得します。データが取得されると、制御はメインの UI スレッドに戻り、表示用に処理されます。ただし、まれに (99% の確率で動作します)、AsyncTask が呼び出されず、AsyncTask が完了するのを永遠に待機して、アプリを貧弱な静的状態のままにすることがあります。
のコードのスナップショットを次に示しますActivity
。
//method call from main UI thread
private void fetchSomeData() {
Log.d("myTag", "In fecthSomeData()");
new ReadFileAsyncTask<DataModel>().execute(this);
}
ReadFileAsyncTask
実装は次のとおりです。
public class ReadFileAsyncTask<A> extends AsyncTask<I_ReadFileListener<A>, Void, A>
{
I_ReadFileListener<A> listener;
@Override
@SuppressWarnings("unchecked")
protected A doInBackground(I_ReadFileListener<A>... params)
{
listener = params[0];
Log.d("mytag", "BACKGROUND: Loading " + listener.getFilename() + " from disk");
A fileContents = (A) FileUtils.readDataFromInternalStorage(listener.getContext(), listener.getFilename());
return fileContents;
}
@Override
protected void onPostExecute(A result)
{
Log.d("myTag", "FOREGROUND: Executing onFileRetrieved listener");
listener.onFileRetrieved(result);
}
}
このまれな障害のログを取得すると、次のようになります。
In fetchSomeData()
...
(Other log messages from other interactions with the activity such as menu creation and navigation initialization)
doInBackground
しかし、重要なのは、メソッドのコードの 2 行目のログ ステートメントではありません。私が考えていたのは、このログ ステートメントが失敗しているということでしたが、ログや ACRA クラッシュ レポートに強制停止メッセージ、エラーは表示されません。アプリケーションはまだアクティブです (他のアクティビティに移動して戻ることができます)。何か案は?