Android 在后台打开AsyncTask中的托管对话框时未定义的结果

Android 在后台打开AsyncTask中的托管对话框时未定义的结果,android,multithreading,Android,Multithreading,当用户(或其他应用程序,如手机应用程序)将我的应用程序推到后台时,我遇到了一个问题,它会给我带来一些问题 我的应用程序包含以下内容: 用户可以输入一些应该推送到服务器的信息 当用户单击“发送”时,我打开一个managed ProgressDialog并启动一个执行服务器通信的AsyncTask 服务器通信完成后,AsyncTask将报告回我的活动,我在其中执行dismissDialog() 在dismissDialog()之后,我将直接使用showDialog()显示另一个托管对话框,该对话框将

当用户(或其他应用程序,如手机应用程序)将我的应用程序推到后台时,我遇到了一个问题,它会给我带来一些问题

我的应用程序包含以下内容:

  • 用户可以输入一些应该推送到服务器的信息
  • 当用户单击“发送”时,我打开一个managed ProgressDialog并启动一个执行服务器通信的AsyncTask
  • 服务器通信完成后,AsyncTask将报告回我的活动,我在其中执行dismissDialog()
  • 在dismissDialog()之后,我将直接使用showDialog()显示另一个托管对话框,该对话框将通知用户提交是否正常或是否失败
  • 这一切都完美无瑕;但是,当AsyncTask正在运行时发生调用时,我会得到(似乎是随机的)以下结果之一:

  • 保存托管对话框的活动将被完全取消,当我返回时,将显示堆栈中的上一个视图
  • 保存托管对话框的活动仍在屏幕上,但它将灰显而不显示对话框。解决这一问题的唯一方法是旋转手机,此时手机会以正确的方式显示“已发送提交”对话框,此后一切正常
  • 所有这些都是在没有任何警告信息的情况下发生的,所以我完全没有任何关于安卓为什么会这样做的线索

    我知道一种解决方法,那就是取消AsyncTask(因此在最后没有显示对话框)。然而,在这个用例中,要求应用程序必须尝试完成服务器事务,以便尽可能少的混淆(即用户怀疑它是否真的被发送)


    有没有其他人遇到过这个问题并知道解决方法?

    如果不查看代码,就很难说出问题出在哪里。然而,这里有一些东西可以帮助你解决这个问题。您可以重写的
    onPause()
    方法

    这直接取自Android javadoc:

    onPause()是处理离开活动的用户的地方。最重要的是,此时应提交用户所做的任何更改(通常提交给保存数据的ContentProvider)


    如果不看代码,就很难说出问题所在。然而,这里有一些东西可以帮助你解决这个问题。您可以重写的
    onPause()
    方法

    这直接取自Android javadoc:

    onPause()是处理离开活动的用户的地方。最重要的是,此时应提交用户所做的任何更改(通常提交给保存数据的ContentProvider)


    我看到了在OnRetainonConfiguration实例中保存对异步任务的引用的建议

    或实现总线:

    编辑:挑战的复杂性有两个方面:

    1) 在kill上保存和恢复应用程序的状态,例如有来电时

    2) 以某种方式在kill上继续异步任务,而不是在pause上取消它

    这两个都是重大的挑战,同时尝试解决这两个问题会让我头疼。事实上,一想到它,我就感到头疼:)一个线索是,你说对话会在方向改变后返回。这可能是因为使用对话框的标准体系结构,操作系统会在方向更改时为您保存和恢复对话框的状态

    [编辑]请参阅Commonware

    @Override
    public Object onRetainNonConfigurationInstance() {
        task.detach();
        return(task);
    }
    

    其中task是的实例

    static class RotationAwareTask extends AsyncTask<Void, Void, Void> {
    
    静态类RotationWareTask扩展异步任务{
    

    我看不出这对所有类型的软杀戮都不起作用的原因,但在硬杀戮中,你会被杀。死了就是死:)

    我看到了在onRetainonConfiguration实例中保存异步任务引用的建议

    或实现总线:

    编辑:挑战的复杂性有两个方面:

    1) 在kill上保存和恢复应用程序的状态,例如有来电时

    2) 以某种方式在kill上继续异步任务,而不是在pause上取消它

    这两个都是重大的挑战,同时尝试解决这两个问题会让我头疼。事实上,我一想到它就头疼:)一个线索是你说对话框会在方向改变时返回。这可能是因为使用对话框的标准体系结构,操作系统会处理保存和恢复在方向更改时为您响铃对话框的状态

    [编辑]请参阅Commonware

    @Override
    public Object onRetainNonConfigurationInstance() {
        task.detach();
        return(task);
    }
    

    其中task是的实例

    static class RotationAwareTask extends AsyncTask<Void, Void, Void> {
    
    静态类RotationWareTask扩展异步任务{
    

    我看不出这对所有类型的软杀戮都不起作用的原因,但是在硬杀戮中,你会被杀。死了就是死:)

    好吧,应用程序(实际上,一个相当大的应用程序)在onPause()中确实做了很多工作,但是,在我的特殊情况下,我看不出这会有什么帮助?如果onPause()的话,我以前尝试过抑制对话框已触发,但随后我遇到了其他问题(即,进度对话框仍被“卡住”)。@sicn我只是想您可以在
    onPause()
    方法中触发一个标志。然后在
    AsyncTask
    中,您可以在继续之前检查该标志,并设置第二个标志来提醒
    onResume()
    选择此任务结束的位置。在
    onResume()中
    method您可以检查第二个标志,然后在此时决定是否显示一个对话框。这只是一个想法。这是我以前做的,但没有帮助。正如我所写的,进度对话框已经启动,然后该对话框将被卡住。:-/嗯,应用程序(实际上,一个相当大的应用程序)在onPause()中做了很多工作然而,在我的特殊情况下,我