皆さん、
onCreate の上部にある次のようなコード スニペットを使用して、未処理の Android 例外をキャッチします。
try {
File crashLogDirectory = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + Constants.CrashLogDirectory);
crashLogDirectory.mkdirs();
Thread.setDefaultUncaughtExceptionHandler(new RemoteUploadExceptionHandler(
this, crashLogDirectory.getCanonicalPath()));
} catch (Exception e) {
if (MyActivity.WARN) Log.e(ScruffActivity.TAG, "Exception setting up exception handler! " + e.toString());
}
Android アプリケーションで使用する約 20 の AsyncTasks に似たものを考え出したいので、doInBackground で発生する未処理の例外がキャッチされてログに記録されます。
問題は、AsyncTask が任意の型初期化子を使用するため、すべての AsyncTask が継承するスーパークラスを宣言して、この未処理の例外ハンドラーを設定する方法がわからないことです。
新しい AsyncTask 定義ごとに上記のようなコードのコピー アンド ペーストを必要としない、AsyncTask の doInBackground メソッドで未処理の例外を処理するための優れた設計パターンを推奨できる人はいますか?
ありがとう!
アップデート
AsyncTaskのソースを詳しく調べた後、使用したデザイン パターンを次に示します。
import java.io.File;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
public abstract class LoggingAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
protected void setupUnhandledExceptionLogging(Context context) {
try {
File crashLogDirectory = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + Constants.CrashLogDirectory);
crashLogDirectory.mkdirs();
Thread.setDefaultUncaughtExceptionHandler(new RemoteUploadExceptionHandler(
context, crashLogDirectory.getCanonicalPath()));
} catch (Exception e) {
if (MyActivity.WARN) Log.e(ScruffActivity.TAG, "Exception setting up exception handler! " + e.toString());
}
}
}
次に、タスクを次のように定義します。
private class MyTask extends LoggingAsyncTask<Void, Void, HashMap<String, Object>> {
protected HashMap<String, Object> doInBackground(Void... args) {
this.setupUnhandledExceptionLogging(MyActivity.this.mContext);
// do work
return myHashMap;
}
}
明らかに、あなたのタスクは、このパターンで必要な任意のパラメータを取ることができます. 必要なロギング/アップロードを行うために RemoteUploadExceptionHandler を定義するのはあなた次第です。