【问题标题】:Calling getActivity() inside an AsyncTask safely在 AsyncTask 中安全地调用 getActivity()
【发布时间】:2016-04-01 21:02:27
【问题描述】:

当我让应用程序在后台运行然后又回到屏幕上显示应用程序时,它不断崩溃。我相信这与我在 onResume() 中运行的 AsyncTask 有关。在其中一个 cmets 上的 answer 中,这个家伙说“跟踪活动的实例并让异步任务等待它不为空”。那么我究竟如何让它等到它不为空呢?

一般来说,当您在 Fragment 中运行的 AsyncTask 将在 Activity/Fragment 生命周期更改期间工作时,引用 Activity 的最安全方法是什么?

【问题讨论】:

  • 将活动传递给 asynctask ,在这种情况下,除非您的异步任务完成,否则您的活动不会被垃圾收集。
  • @dex 所以你的意思是不要在 AsyncTask 中调用 getActivity() 而是将活动的引用传递给 AsyncTask?这会自动防止 Activity 被垃圾收集?
  • 只是不要使用 AsyncTask。改用加载器(AsyncTaskLoader 是一个很好的起点),它旨在适当地处理配置更改。

标签: java android android-asynctask


【解决方案1】:

首先,您可以在创建片段时使用包含该片段的活动对 getactivity() 进行类型转换,并使 mActivity 成为全局变量。

MainActivity mActivity = (MainActivity)getActivity(); 

您可以在 Asynctask 中进一步使用该变量,并可以进一步检查活动是否完成(不要检查 null)

mActivity.isFinished();

【讨论】:

    【解决方案2】:

    永远不要指望Activity 在后台或后台堆栈中运行(甚至存在)。将AsyncTask 放入保留的Fragment 是保持任务在配置更改(例如,设备轮换)时运行的好方法,但在活动处于后台时则不行。任何应该在后台继续运行的东西都属于Service

    【讨论】:

    • 我没有运行任何会在后台线程中持续运行的东西,所以使用服务不是我关心的问题。我只希望在调用onResume() 时更新片段中显示的数据,因此当用户返回应用程序时,它会加载最新数据。此数据通过 AsyncTask 检索。它包含在保留的 Fragment 中,但我还需要获取托管活动中的数据,因此我在 AsynctTask 中使用 getActivity()。
    【解决方案3】:

    不推荐。如果您需要在 AsyncTask 中访问您的 Activity,那么最好的方法是创建一个接口,让您的 Activity 实现该接口,并将该 Activity 实例传递给 AsyncTask 构造函数。您的 AsyncTask 将需要接口类型的属性。所以,你可以通过这个接口调用activity上实现的方法

    【讨论】:

    • 即便如此,您也有内存泄漏的风险(因为任务仍然持有对 Activity 的引用)。
    猜你喜欢
    • 2021-04-27
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多