在Activity的后台线程中执行操作的最简单方法是什么?

时间:2014-06-15 18:45:24

标签: android multithreading

我确信这个问题会被问到很多,但我正在寻找最简单的解决方案,考虑到Android最佳实践(没有hacky清单试图保留单个Activity实例)。另外,我不是在寻找保留Fragment解决方案。

我正在寻找Activity中最简单的方法来启动后台任务并提供回调函数。如果重新创建Activity(配置更改),那么我希望旧活动释放引用,并将回调附加到新的Activity实例。

最后,我不想再次执行操作。意思是,如果它是一些HTTP资源,它应该被缓存,以便不再浪费地运行操作。

谢谢!

2 个答案:

答案 0 :(得分:0)

首先,您需要将任务执行和活动(UI)分离。要实现此目的,您可以使用UI发送给某些task executor的事件。基本思想如下:

  1. 当调用方法onResume时,您会注册活动以接收事件。
  2. 然后在某处执行任务以从网络加载一些数据。
  3. 接下来你有三个选择:
    • a)任务完成,您的活动存在。任务发送事件"我已完成"。并且您的活动会收到它。
    • b)任务已完成但您的活动已被破坏/隐藏。当活动被隐藏时,系统会调用您的活动的onStop方法,您可以取消注册活动以接收新活动。所以事件没有交付。
    • c)任务未完成,并且已创建新活动。新活动会检查数据是否可用或现在正在onResume方法下载。如果已下载,则显示,如果没有,则等待。
  4. 详细说明如下:http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html

    最受欢迎的Android活动库:OttoEventBus

答案 1 :(得分:0)

我的经验最简单的方法是使用AsyncTask(http://developer.android.com/reference/android/os/AsyncTask.html)。但是,配置更改后可能会爆炸。所以你应该将AsyncTask附加到“HeadlessFragment”。对于Fragment,您可以启用“setRetainInstanceState”,以便不会重新创建片段。然后在配置更改后,您可以再次附加到该片段。