2013-02-18 55 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