【问题标题】:Android design pattern for background operation with UI and non-UI modes具有 UI 和非 UI 模式的后台操作的 Android 设计模式
【发布时间】:2014-08-06 09:05:00
【问题描述】:

我有一个后台操作,我希望能够以两种模式运行:

  • UI模式,由用户启动,在整个生命周期内为用户提供操作状态的精准反馈。

  • 非UI模式,由AlarmManager发起,为用户提供生命周期结束时的操作摘要。

只实现UI 模式的自然设计选择是AsyncTask,只实现非UI 模式的自然设计选择是IntentService

同时实现这两种模式的自然设计选择是什么?即,将这两种模式合并到一个对象中的自然设计选择是什么?

【问题讨论】:

    标签: android android-asynctask android-intentservice


    【解决方案1】:

    我不会让一个对象通过不同的方式(UI / 非 UI)做同样的事情,而是将业务逻辑移动到一个单独的类中,然后激活两个不同的对象(AsyncTaskIntentService)在您需要的时候,并在其中使用该对象。另外,您打算在AsyncTask 中运行什么样的任务?

    【讨论】:

    • AsyncTask 将获取网络内容。内容的数量将取决于几个因素,并且可能需要大约一秒钟或更长的时间。我正在考虑实施“取消并安排在后台运行”选项,以使用户能够决定何时等待足够长。
    • 如果您需要获取网络数据,我建议使用PicassoloopjRoboSpiceAsynTask 有很多注意事项(处理屏幕旋转,保持 Activity 等)。
    • 那些库看起来很有趣,但它们似乎不够强大(它们本身),特别是我们需要访问和操作 DOM。
    【解决方案2】:

    目前,我倾向于以下解决方案。定义不带 UI 的 MyAsyncTask 和带 UI 的 MyUIAsyncTask extends MyAsyncTask;这样就实现了 UI 模式。定义 MyService,它有一个 MyAsyncTask 的实例(参见 [Is it possible to use AsyncTask in a Service class?);实现非UI模式。我不相信这是最好的解决方案,而且它违反了以下threading rules

    • AsyncTask 类必须加载到 UI 线程
    • 任务实例必须在UI线程上创建。
    • execute(Params...) 必须在 UI 线程 上调用。

    【讨论】:

    • 似乎使用AlarmManager 启动MyAsyncTask 是不明智的:stackoverflow.com/questions/25174226/…
    • 嗨,警报管理器是不同的,它扩展了广播接收器,并且广播中的意图仅停留几秒钟,因此当您的服务在 UI 线程上运行时,只建议短运行过程,直到您不分叉不同的线程所以你总是可以从它开始一个异步任务
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多