Шаблон проектирования для перехвата необработанных исключений в AsyncTask

Народ,

Я поймаю необработанные исключения 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 для выполнения необходимой регистрации / загрузки.

8
задан esilver 11 August 2011 в 21:19
поделиться