Android IntentService / Service,用于向Web服务请求/发送数据并获取UI的进度

时间:2015-06-03 03:14:25

标签: android file-upload broadcastreceiver intentservice localbroadcastmanager

在Android上基本上,我正在尝试从Web服务上传/下载数据并有一个进度条,应该呈现显示进度百分比。

以下是我实施的方法以及考虑它们的原因:

  1. 选择IntentService在后​​台运行 根据{{​​3}},我无法使用绑定服务,因为它会在绑定的Activity / Fragment被销毁时销毁。因此选择IntentService而不是Service。移动它将是一次和意图服务在工作线程上工作,所以它更好。
  2. 广播以接收更新: 实施LocalBroadcastManager以更新进度条UI,方法是将其注册为收听上述IntentService收到的广播。
  3. 然而,采用这种方法,需要解决以下问题:

    不维护广播序列。广播包含上传/下载进度的百分比。但由于序列没有得到维护,我很可能会收到陈旧的更新(例如:我可能会在40%之后收到30%)。我也尝试使用sendBroadcastSync的{​​{1}}方法,但它不能始终如一地工作(我对此不太确定)。因此,我尝试通过LocalBroadcastManager实现Messenger但是我知道重新创建UI后,该方法将无法重新连接到正在进行的上传/下载(Activitiy / Fragment被销毁并创建)。基本上,Handler的引用与之前的活动/片段一起丢失,因此消息不会传递给UI进行更新。

    我一直试图解决问题,但我无法完成任务。你的智慧之言将非常有用。

3 个答案:

答案 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%完成 - 你可以跳过时间戳而只是应用新的百分比高于您当前显示的百分比。