当前位置: 首页 > 面试题库 >

完成AsyncTask后,如何处理关闭DialogFragment(兼容性lib)

廖鸿达
2023-03-14
问题内容

关于如何处理AsyncTask期间的配置更改的文章很多,但是我发现没有一个关于AsyncTask完成并尝试关闭DialogFragment(兼容性库)时处于后台的应用程序(onPause())的明确解决方案。

这是问题所在,如果我运行的AsyncTask应该在onPostExecute()中关闭DialogFragment,则当应用程序试图关闭DialogFragment时,它在后台时会收到IllegalStateException。

private static class SomeTask extends AsyncTask<Void, Void, Boolean> {

    public SomeTask(SomeActivity tActivity)
    {
        mActivity = tActivity;
    }

    private SomeActivity mActivity;

    /** Set the view during/after config change */
    public void setView(Activity tActivity) {
        mActivity tActivity;
    }

    @Override
    protected Boolean doInBackground(Void... tParams) {
        try {
          //simulate some time consuming process
          TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException ignore) {}
        return true;
    }

    @Override
    protected void onPostExecute(Boolean tRouteFound) {
        mActivity.dismissSomeDialog();  
    }

}

该活动如下所示:

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

public class SomeActivity extends FragmentActivity {

    public void someMethod() {
        ...
        displaySomeDialog();
        new SomeTask(this).execute();
        ...
    }

    public void displaySomeDialog() {
        DialogFragment someDialog = new SomeDialogFragment();
        someDialog.show(getFragmentManager(), "dialog");
    }

    public void dismissSomeDialog() {
        SomeDialogFragment someDialog = (SomeDialogFragment) getFragmentManager().findFragmentByTag("dialog");
        someDialog.dismiss();
    }

    ....

}

正常运行,除非SomeTask仍在运行时应用html" target="_blank">程序切换到后台。在那种情况下,当SomeTask尝试关闭disSomeDialog()时,我得到一个IllegalStateException。

05-25 16:36:02.237: E/AndroidRuntime(965): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

我所见过的所有帖子似乎都通过精心设计的变通办法指向了一些混乱的方向。是否没有某种Android处理方式?如果它是一个Dialog而不是DialogFragment,那么Activity的dismissDialog()将正确处理它。如果它是真实的DialogFragment而不是ACP中的一个,则dismissAllowingStateLoss()将对其进行处理。DialogFragment的ACP版本没有这样的东西吗?


问题答案:

要解决非法状态异常问题并实质上实现dismissAllowingStateLoss(),可以使用以下方法来完成。

getFragmentManager().beginTransaction().remove(someDialog).commitAllowingStateLoss();

这应该在没有hacky代码的情况下解决该问题。如果您具有使用dialog.show();通过处理程序与UI线程进行通信的线程,则也可以将其应用于show。这也可能导致非法状态异常

getFragmentManager().beginTransaction().add(someDialog).commitAllowingStateLoss();

鉴于发帖人的问题,@ joneswah是正确的。如果使用支持库,请更换

getFragmentManager()

getSupportFragmentManager()

对于未来的Google员工:@Alex
Lockwood对该解决方案提出了良好而有效的关注。该解决方案确实可以解决该错误,并且在大多数情况下都可以使用,但是从UX的角度暗示了原始问题中的方法存在问题。

该活动应假定异步任务可能未完成并且不会执行onPostExecute()。无论启动任何UI操作(即微调器,理想情况下不是对话框)来通知用户异步操作,都应具有在超时或通过跟踪状态并检入onRestore
/ onResume类型生命周期事件来自动停止的规定,以确保用户界面已正确更新。服务可能也值得调查。



 类似资料:
  • 处理 css 兼容性需要使用到 postcss-loader 和postcss-preset-env两个插件 一、css 兼容性处理核心配置 1.1、修改webpack.config.js 配置文件 // webpack.config.js webpack的配置文件 // 路径: ./webpack.config.js ………… // 设置 nodejs 环境变量 process.

  • 问题内容: 我正在试图做的是传递给函数,然后使用传递通过设置将返回。 我在中创建闭包时遇到了问题, 它引发了编译器错误/崩溃: 在斯威夫特,是根据文档应该包含的对象,就像Objective-C的版本。 这是我当前的代码: 编辑:似乎错误与不被视为数组有关。现在编译,但是我想集的时候得到什么,但无内。我检查了传递的,它们是有效的。 编辑2:打印后,我可以确认它返回了数据。但是仍然返回nil。 问题答

  • 问题内容: 由于某种原因,我完成后没有被调用。 我的班级干事: 我的onPostExecute(): 一切正常,我成功完成并返回一个布尔值,但随后就结束了。 谢谢 问题答案: 您是否在UI线程上创建了AsyncTask?还要在onPostExecute()方法上添加一个@Override注释,以确保正确声明了它。

  • ngrok承诺有关其接口的兼容性和稳定性,以便您可以自信地构建集成顶部,知道在升级到较新版本时期望的更改。 兼容性承诺 Point Release (2.0.0 -> 2.0.1) - ngrok承诺在点发布之间没有突破性的变化 Minor Version Change (2.0 -> 2.1) - ngrok可能会进行小的更改,打破兼容性的次要版本更改。 ngrok承诺,任何破坏性更改将由一个版

  • 我正在使用JBoss 5.1(EAP)。我正在使用Spring webservice(3.0.5)。对于编组,我使用JaxB。 我正在使用maven。jaxb2。用于从模式(xsd)生成pojo的插件。 当我在JBoss上部署EAR时,我得到以下错误: 我已经检查了jaxb2插件版本,并尝试使用以前的版本,假设JBoss得到了JaxB2.1.12,尝试了许多版本,但没有运气。 有什么建议吗? 谢谢

  • 错误:------崩溃开始 08-04 05:53:11.807 266 7-2667/com.example.kwei.minigame1 E/AndroidRuntime:致命异常:main process:com.example.kwei.minigame1,PID:2667 java.lang.nullpointerException:试图在com.example.kwei.minigam