2013-02-18 56 views
1

我有一个棘手的用例,我试图找到最佳设计。描述是:从服务中下载文件(使用更新UI)

  • 应该有一个FolderListActivity与相应的视图,其中显示了可供下载的文件夹列表
    • 用户能够对项目长按,并把它添加到下载队列
  • 另一项活动叫DownloadingQueueActivity应该可用,其中:
    • 显示了队列中的项目,以进度条的列表(下载的文件/文件总数)
    • 它的重排(用户应该能够改变队列项的顺序)
    • 项目可以被删除(或者甚至是整个队列)
    • 下载可暂停

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

  • 下载文件从队列文件夹
  • 进展情况通知DownloadingQueueActivity
  • 监听队列的变化(由DownloadingQueueActivity

我试图做这通过Messenger,但我结束了与许多不同类型的消息,我不认为这是优雅的解决方案。

任何意见,甚至暗示实施这是非常感谢。

回答

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) { 
    } 

}; 

然后在你的下载服务,当它的时间来更新的意见,只是将消息发送到已在设定的监听器服务(也不要忘了在创建该服务的addListener功能以及在的onStop活动的移除监听器()):

listener.updateViews(30); 
+0

谢谢您的回答。 我有两个问题: - 你将如何实现下载部分?我唯一关心的是如何处理服务队列? - 为什么updateView在主线程中运行,即使您是从后台线程调用它? – 2013-02-19 11:10:07

+0

找出我的问题的答案。谢谢。 – 2013-02-19 12:20:54

+0

updateView线程不会在主UI线程上调用,因此不会允许您更新视图。要解决这个问题,你可以使用runOnUIThread函数。我已更新我的示例以显示此内容 – Nick 2013-02-19 15:17:35