Народ,
Я ловлю необработанные исключения Android через фрагмент кода, подобный этому, в верхней части onCreate:
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());
}
Я хотел бы придумать что-то подобное примернодве дюжины AsyncTasks, которые я использую в своем приложении для Android, поэтому необработанные исключения, возникающие в doInBackground, перехватываются и регистрируются.
Проблема в том, что AsyncTask принимает инициализаторы произвольного типа, я не уверен, как объявить суперкласс, из котороговсе мои AsyncTasks наследуют, что устанавливает этот обработчик необработанных исключений.
Может кто-нибудь порекомендовать хороший шаблон проектирования для обработки необработанных исключений в методе doInBackground AsyncTask, который не включает в себя копирование и вставку кода, подобного описанному вышедля каждого нового определения AsyncTask?
Спасибо!
ОБНОВЛЕНИЕ
Вот шаблон проектирования, который я использовал, после более пристального взгляда на источник 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, чтобы выполнить необходимую регистрацию / загрузку.