屏幕被其他应用程序锁定或重叠时AsyncTask

时间:2014-02-19 12:26:38

标签: android android-fragments android-asynctask

有一个包含“提交”操作的片段页面。 提交按钮将启动AsyncTask.execute,它在doInBackground中创建一些网络作业,然后将显示成功的Toast消息并在onPostExecute中删除它自己。

如果在onPostExecute发生时屏幕已经关闭的情况下,如何避免“ IllegalStateException:在onSaveInstanceState 之后无法执行此操作”?

当它们无法在锁定的活动状态下完成时,是否可以等待popBackStack()或onBackPressed()等操作?

PS 与屏幕旋转或其他配置无关的当前问题会更改事件。

代码示例(来自片段的AsyncTask):

private final class SubmitTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
        //...
        }

        @Override
        protected void onPostExecute(String err) {
            if (err != null) {
                Toast.makeText(parentActivity, "Error occured: " + err, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(parentActivity, "Saved", Toast.LENGTH_SHORT).show();
                parentActivity.getSupportFragmentManager().popBackStack();// <<---- Exception crashed here
            }
        }

2 个答案:

答案 0 :(得分:0)

最简单的事情就是

try{....}

catch(IllegalStateException e){

}

答案 1 :(得分:0)

使用IntentService代替AsyncTask,然后在onHandleIntent()开展工作。它是Fragment's生命周期的背景和独立,它也适用于工作(后台)线程。

这种方法的缺点来自于FragmentActivity的独立性 - 您没有Context而且您无法显示Toast。但这是您需要的敏捷性的合理价格,您仍然可以发送Notification或执行与Intent相关的任何事情 - 开始新的Activity或发送广播。