java - 在 AsyncTask 中捕获未处理异常的设计模式

标签 java android exception android-asynctask unhandled-exception

各位,

我在 onCreate 的顶部通过这样的代码 fragment 捕获未处理的 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 应用程序中使用的大约两打 AsyncTasks 提出类似的东西,以便捕获并记录 doInBackground 中发生的未处理异常。

问题是,因为 AsyncTask 采用任意类型的初始值设定项,我不确定如何声明一个父类(super class),我的所有 AsyncTasks 都继承自该父类(super class),它设置了这个未处理的异常处理程序。

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

谢谢!

更新

这是我在仔细查看 source of 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 以执行必要的日志记录/上传。

最佳答案

我不会把它称为设计模式,而只是包装 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);
}

关于java - 在 AsyncTask 中捕获未处理异常的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7021046/

相关文章:

android - 如何在 Android 上暂停 handler.postDelayed() 计时器

Java 迭代器移除异常契约

java - 为什么会出现 java.util.ConcurrentModificationException?

java - 空 ListView 显示另一个 Activity

Java:完全禁用任何 Swing 不需要的蜂鸣声的方法?

java - PriorityQueue 与 Collections.sort

java - Yaml文件读取对象歧义

java - 该应用程序不起作用。它适用于 Android 5.1,但不适用于 Android 10.0

Android opengl es和白色纹理

c# - 即使预期没有异常也使用 try catch