【问题标题】:App crashes when user changes fragment during AsyncTask当用户在 AsyncTask 期间更改片段时应用程序崩溃
【发布时间】:2013-10-24 08:42:33
【问题描述】:

我遇到了以下问题。在我的应用程序中,我正在 AsyncTask 中加载数据。问题是,当用户现在单击图标打开导航抽屉并打开另一个片段时,应用程序崩溃了。当 AsyncTask 完成后,应用程序不会崩溃。遇到的问题是,当我切换片段时(片段总是相同的,只是另一个内容依赖于 NavigationDrawer 项单击),应用程序崩溃了。

我想问题是,异步任务没有完成,我再次调用同一个片段想要显示不同的数据。

那么我的处理方法是什么?为每个不同的视图使用不同的片段?我认为每次使用相同的片段要容易得多,因为它只是显示不同的数据,但结构、布局等都是相同的。只是它得到的数据不同。

我还考虑过以某种方式“阻止”用户在执行异步任务时执行任何其他操作,但仍向他显示应用正在处理。但这不是 AsyncTask 的定义。

你会如何处理它?为每个不同的显示使用不同的片段?或者怎么做?以某种方式阻止?如果用户单击导航抽屉的项目,则 asynctask 需要停止其所有操作(如果已完成某些操作),然后重新开始执行所有操作。有办法吗?

请注意,执行异步的片段和调用片段的活动位于两个不同的文件中

【问题讨论】:

    标签: android android-fragments android-asynctask


    【解决方案1】:

    您可以使用加载屏幕来阻止屏幕(不是那么好的用户体验...),或者您可以在更改片段时取消异步任务,在销毁或分离方法中。

    您没有显示错误,但我猜应用程序崩溃是因为您尝试访问 asynctask onPostExecute 方法中的某些内容,并且它不再可用...

    【讨论】:

    • 你的猜测是正确的。我无法显示代码,对不起。但我认为这没有任何帮助,因为它只是在分配视图时。而已。所以我会尝试取消异步任务?我怎么做?只需asynctask.cancel(true)?
    • 是的,但也要检查它是否被取消。检查这个stackoverflow.com/a/6053943/562840
    • 这就是有趣的开始。我启动片段,onCreate 检查之前是否取消了异步任务。当然不是,因此它执行异步任务。现在,当我单击导航菜单项时,片段会从头开始再次启动,然后异步任务不会被取消。所以我必须以某种方式从异步任务所在的活动中取消它。我该怎么做/
    • 当您按下导航菜单项时,会启动片段的新实例,对吗?前一个实例仍应传入生命周期方法,因此您可以在暂停/销毁/分离类似的东西时从启动它的片段中取消异步任务。也可以在postexecute方法中检查任务是否被取消,如果是则中断循环。
    • 谢谢。这有帮助。我在暂停的方法上取消了它!这工作:) 非常感谢! @Mikel-您能否编辑您的答案,以便人们看到实际上对我有什么帮助而不必通读所有cmets? :)
    【解决方案2】:

    我猜它崩溃是因为您的 AsyncTask 正在向一个不存在的类实例发送数据。您应该更改从 asynctask 接收回调的类。无论如何,在我看到你的 AsyncTask 的真实代码之前,我无法给你更好的答案(至少 onPostExecute() 和 onProgressUpdate())

    【讨论】:

    • PostExecute 只是运行一个将视图添加到布局的 for 循环。
    • 而布局是调用AsyncTask的Fragment的一部分?当您更改片段时,它会破坏旧片段视图,因此您会丢失该片段的布局。还有关于取消任务。当您取消 AsyncTask 时,它无论如何都会调用 onPostExecute() ,因此您可以获得相同的崩溃。如果您在 for 循环中添加视图的布局是被破坏片段的一部分,则最好通过接口从 onPostExecute 返回数据您从源代码中获取并在实现接口的类中进行所有更改。此外,您将需要一个管理器来更改实例
    • 将处理 AsyncTask 响应的类
    【解决方案3】:

    使用意图服务来执行请求任务意味着在意图服务中调用请求任务,该服务能够在不挂起 UI 的情况下处理后台任务

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2014-06-05
      相关资源
      最近更新 更多