【发布时间】:2011-07-17 04:38:37
【问题描述】:
问题
在我的应用程序中,我需要下载文件。在某些情况下我只需要单向通信,基本上与下载完成的Activity进行通信。在其他情况下,我需要能够与后台进程通信以取消下载,然后在该任务完成后中继回 Activity(双向通信)。
规定
在所有情况下,下载仅与一个 Activity 相关联,因此 Service 似乎没有必要,因为我不需要在用户执行其他操作时保持下载在后台运行。下载时用户总是被阻止。下载过程应该是独立于活动的(不是专门为一个活动...可重用的)。拥有一种满足所有要求的解决方案将是理想的。
用例
我现在的两个案例如下:
- 下载文件时向用户显示
ProgressDialog。一旦文件完成下载,用户将继续进行下一个活动。不需要显示进度。 - 在下载大文件时,会向用户显示
ProgressBar。有一个取消按钮可以中止下载文件。按下取消按钮应该向后台进程发出信号以中止下载文件,然后在执行该操作后通知活动。下载文件时需要显示进度。
我尝试过的
我最初的实现是一个单独的类,在一个线程中运行,它传入一个Context 来广播进度。这允许从后台进程到 Activity 的通信,但反之则不行。
我尝试了Service,但从我阅读的各种文章中,确定我的需求不能证明服务是合理的,因为在下载发生时需要阻止用户。我以前从未实现过 Service,所以我也遇到了通信问题(可能实现不佳)。
什么是理想的
双向BroadcastReceiver。那可能吗?如果我想从后台进程获得反馈,我喜欢注册一个 BroadcastReceiver,如果我不在乎的话。我已经在一个类中有一个方法,该方法接受 InputStream 和 File 并进行传输,因此该方法可以在需要立即下载文件的任何地方重用。
【问题讨论】:
-
“下载时用户总是被阻止”——呸。
-
需要数据才能进入下一个屏幕。这就是为什么我也希望它可以取消。
-
您是否真的认为您的用户会在乎为什么他们会被卡在摆弄拇指而不是至少使用您的应用程序中不会使用的部分 依赖这些数据?
-
用户在下载时不能做一些有用的事情。我很清楚让用户盯着加载屏幕并不吸引人,但该应用程序取决于正在下载的内容(并且在您建议在应用程序本身中包含正在下载的内容之前,下载的内容由用户)。
标签: android multithreading android-service android-asynctask