如何在Android中的AsyncTask中优雅地处理异常?

我有一个AsyncTask在后台执行sqlite数据库迁移(创建或升级).假设某种方式会在doInBackground中抛出一个IOException或sqliteException,并且由于数据库状态可能不在期望的状态,应用程序继续运行是毫无意义的.在这种情况下,我有什么困难的.

我正在考虑让应用程序尽快崩溃并显示带有错误消息的对话框,但是我不太确定如何在doInBackground里面,因为:

>这个函数不是在UI线程中执行的,所以我不知道我是否可以显示一个对话框.
>我不知道如何访问AsyncTask中的当前活动,所以我无法完成()它.
>我想以某种方式将异常抛出到上层,让一个活动处理它,但这是不可能的,因为doInBackground不会将IOException列为检查的异常.

任何人都有如何正确处理这种情况的建议?

解决方法

您不能在非ui线程中显示对话框.您可以将活动引用传递给异步任务.为了处理这种情况,你可以尝试在doInBackground中捕获异常并重新抛出onPostExecute

例如

private class MyAsyncTaskTask extends AsyncTask<...> {

     private Activity ownerActivity;
     private Exception exceptionToBeThrown;

     public MyAsyncTaskTask(Activity activity) {
         // keep activity reference
         this.ownerActivity = activity;
     }

     protected Long doInBackground(...) {
         try {
             ...
         } catch (Exception e) {
             // save exception and re-thrown it then. 
             exceptionToBeThrown = e;
         }
     }

     protected void onPostExecute(...) {
         // Check if exception exists.
         if (exceptionToBeThrown != null) {
             ownerActivity.handleXXX();
             throw exceptionToBeThrown;
         }
     }
 }

如果异步任务在Acvitiy类中,那么您可以直接访问它,例如,

public class MyActivity extends Activity {
    ...
    AsyncTask<...> task = new AsyncTask<...>() {
        public void onPostExecute(...) {
            // Access activity directly
            MyActivity.this.xxx()
        }
    }
}

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...