从服务下载文件(使用更新UI)

时间:2013-02-18 22:44:23

标签: android service downloading

我有一个棘手的用例,我正试图找到最好的设计。描述是:

  • 应该有一个FolderListActivity对应的视图,其中显示了可供下载的文件夹列表
    • 用户可以长按项目,并将其添加到下载队列
  • 应该有另一个名为DownloadingQueueActivity的活动,其中:
    • 显示队列中的项目列表,带有进度条(已下载的文件/总文件)
    • 它可重新排列(用户应该能够更改队列中项目的顺序)
    • 项目可以删除(甚至整个队列)
    • 可以暂停下载

此外,这应由服务处理,因为从应用程序退出后应继续下载。因此,服务应该能够:

  • 从队列
  • 下载文件夹中的文件
  • 通知DownloadingQueueActivity进度
  • 侦听队列的更改(由DownloadingQueueActivity
  • 引起

我尝试通过Messenger执行此操作,但我最终得到了许多不同类型的消息,我认为这些消息并不是优雅的解决方案。

非常感谢任何有关实施此建议甚至暗示的建议。

1 个答案:

答案 0 :(得分:1)

好像你走在了正确的轨道上。您将拥有处理所有下载的DownloadService。您的DownloadingQueueActivity可以绑定到此Service。当它绑定时,您可以获得更新活动所需的所有信息。

对于推送通知,您可以使用监听器。因此,为Activiy创建一个新的接口来实现:

public static interface DownloadListener {

    void updateViews(int progress);
}

然后将此功能添加到您的活动中。

public class DownloadingQueueActivity {

    public void updateViews(int progress) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //update views
            }
        });
    }
}

然后在绑定后将侦听器添加到服务:

private ServiceConnection listenerStarter = new ServiceConnection() {

    public void onServiceConnected(ComponentName name, IBinder service) {

        DownloadService ds = ((DownloadService.LocalBinder) service).getService();
        ds.addListener(DownloadingQueueActivity.this);

    }

    public void onServiceDisconnected(ComponentName className) {
    }

};

然后在您的DownloadService中,当需要更新视图时,只需向服务中设置的侦听器发送消息(也不要忘记在服务中创建addListener函数以及删除中的侦听器) onStop()的活动):

listener.updateViews(30);