有一个包含“提交”操作的片段页面。 提交按钮将启动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
}
}
答案 0 :(得分:0)
最简单的事情就是
try{....}
catch(IllegalStateException e){
}
答案 1 :(得分:0)
使用IntentService代替AsyncTask
,然后在onHandleIntent()
开展工作。它是Fragment's
生命周期的背景和独立,它也适用于工作(后台)线程。
这种方法的缺点来自于Fragment
或Activity
的独立性 - 您没有Context
而且您无法显示Toast
。但这是您需要的敏捷性的合理价格,您仍然可以发送Notification
或执行与Intent
相关的任何事情 - 开始新的Activity
或发送广播。