Народ,
Я поймаю необработанные исключения 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, перехватываются & logged.
Проблема в том, что AsyncTask принимает произвольные инициализаторы типов, я не уверен, как объявить суперкласс, от которого наследуются все мои AsyncTasks, который устанавливает этот обработчик необработанных исключений.
Кто-нибудь может порекомендовать хороший дизайн шаблон для обработки необработанных исключений в методе doInBackground AsyncTas k, который не требует копирования и вставки кода, подобного приведенному выше, для каждого нового определения 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 extends AsyncTask {
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> {
protected HashMap doInBackground(Void... args) {
this.setupUnhandledExceptionLogging(MyActivity.this.mContext);
// do work
return myHashMap;
}
}
Очевидно, ваша задача может возьмите все необходимые параметры с этим шаблоном. Вам решать, как определить RemoteUploadExceptionHandler для выполнения необходимой регистрации / загрузки.