用于在AsyncTask中捕获未处理的异常的设计模式

esi*_*ver 8 java android exception unhandled-exception android-asynctask

伙计们,

我在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());
    }
Run Code Online (Sandbox Code Playgroud)

我想在我的android应用程序中使用类似的二十几个AsyncTasks,因此捕获并记录了doInBackground中发生的未处理异常.

问题是,因为AsyncTask采用任意类型的初始化器,我不知道如何声明一个超类,我的所有AsyncTasks都继承了它,它设置了这个未处理的异常处理程序.

任何人都可以推荐一个好的设计模式来处理AsyncTask的doInBackground方法中的未处理异常,它不涉及每个新的AsyncTask定义的上述代码的复制和粘贴?

谢谢!

UPDATE

在仔细查看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());
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

然后我定义我的任务如下:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

显然,你的任务可以采用这种模式所需的任何参数.您可以定义RemoteUploadExceptionHandler来执行必要的日志记录/上传.

Nik*_*kov 3

我不会将其称为设计模式,而只是doInBackground()根据需要进行包装和初始化和/或捕获异常。

public abstract class AsyncTaskWrapper<Params, Progress, Result> extends
        AsyncTask<Params, Progress, Result> {

    protected Exception error;

    protected Result doInBackground(Params... params) {
        try {
            init();

            return doRealWork(params);
        } catch (Exception e) {
            error = e;

            Log.e("TAG", e.getMessage(), e);

            return null;
        }
    }

    protected abstract void init();

    protected abstract Result doRealWork(Params... params);
}
Run Code Online (Sandbox Code Playgroud)