5

解決しようとしているアプリで非常に散発的なエラーが発生します。アプリに入ると、ある時点でメイン 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 クラッシュ レポートに強制停止メッセージ、エラーは表示されません。アプリケーションはまだアクティブです (他のアクティビティに移動して戻ることができます)。何か案は?

4

1 に答える 1