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

如何在Android中的AsyncTask中优雅地处理异常?,第1张

概述我有一个AsyncTask在后台执行SQLite数据库迁移(创建或升级).假设某种方式会在doInBackground中抛出一个IOException或SQLiteException,并且由于数据库状态可能不在期望的状态,应用程序继续运行是毫无意义的.在这种情况下,我有什么困难的. 我正在考虑让应用程序尽快崩溃并显示带有错误消息的对话框,但是我不太确定如何在doInBackground里面,因为: 我有一个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中的AsyncTask中优雅地处理异常?全部内容,希望文章能够帮你解决如何在Android中的AsyncTask中优雅地处理异常?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1131383.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存