在Android上基本上,我正在尝试从Web服务上传/下载数据并有一个进度条,应该呈现显示进度百分比。
以下是我实施的方法以及考虑它们的原因:
IntentService
在后台运行
根据{{3}},我无法使用绑定服务,因为它会在绑定的Activity / Fragment被销毁时销毁。因此选择IntentService
而不是Service
。移动它将是一次和意图服务在工作线程上工作,所以它更好。LocalBroadcastManager
以更新进度条UI,方法是将其注册为收听上述IntentService
收到的广播。然而,采用这种方法,需要解决以下问题:
不维护广播序列。广播包含上传/下载进度的百分比。但由于序列没有得到维护,我很可能会收到陈旧的更新(例如:我可能会在40%之后收到30%)。我也尝试使用sendBroadcastSync
的{{1}}方法,但它不能始终如一地工作(我对此不太确定)。因此,我尝试通过LocalBroadcastManager
实现Messenger
但是我知道重新创建UI后,该方法将无法重新连接到正在进行的上传/下载(Activitiy / Fragment被销毁并创建)。基本上,Handler
的引用与之前的活动/片段一起丢失,因此消息不会传递给UI进行更新。
我一直试图解决问题,但我无法完成任务。你的智慧之言将非常有用。
答案 0 :(得分:2)
使用界面怎么样? UI:在创建活动/片段时获取实例和setCallback(),Service:获取实例并调用update(如果未从主线程调用,则使用处理程序,handler.post(runnable {... update ...}))。
如果要通知多个UI实例,请在updater类中保留一个ArrayList,并将'setCallback'方法修改为'addCallback',并更新'update'中的每个列表项。
public class ProgressUpdater {
private static ProgressUpdater sUpdater;
private UpdateCallback mCallback;
public interface UpdateCallback {
public void update(long progress);
}
public void setCallback(UpdateCallback callback) {
mCallback = callback;
}
public void update(long progress) {
if (mCallback != null) {
mCallback.update(progress);
}
}
public static ProgressUpdater getInstance() {
if (null == sUpdater) {
sUpdater = new ProgressUpdater();
}
return sUpdater;
}
private ProgressUpdater() {
}
}
答案 1 :(得分:1)
如果您想不断更新您的用户界面,我们可以从服务中启动本地广播管理员,并在您的活动中注册您的广播接收器。
答案 2 :(得分:1)
我会稍微改变一下这个问题,因为消息的排序可能是各种消息解决方案的问题。
事实上,在30%事件发生后你获得40%的比赛并不是一个真正的问题。 是一个问题,如果您更新UI以反映30%。
让每个事件(使用class Dashboard extends Admin_controller
{
public function __construct()
{
parent::__construct();
}
public function some_admin_method()
{
//
}
}
作为事件总线时每个Intent
)包含时间戳和百分比完成。在UI中跟踪最后看到的事件时间戳。如果您收到的事件早于上次见过的事件时间戳,请忽略该事件。
如果你确定你的百分比是单调增加的 - 换句话说,没有合法的情况你可能会从40%下降到30%完成 - 你可以跳过时间戳而只是应用新的百分比高于您当前显示的百分比。