我有一个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() } } }