Android IntentService/Service请求/发送数据到web Service,并将进度发送到UI



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

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

  1. 选择IntentService在后台运行:根据链接,我不能使用绑定服务,因为当绑定的活动/片段被销毁时,它会被销毁。因此选择IntentService而不是Service。如果把它移过去,它将是一次性的,并且intent服务在一个工作线程上工作,所以它会好得多。
  2. 广播接收更新:实现LocalBroadcastManager通过注册它来更新进度条UI来收听上述IntentService接收的广播。

然而,使用这种方法,需要解决以下问题:

广播顺序未维护。广播中包含上传/下载的进度百分比。但是由于没有维护序列,所以我有可能收到过时的更新(例如:我可能在收到40%更新后收到30%更新)。我还尝试使用LocalBroadcastManagersendBroadcastSync方法,但它不一致(我对此不是很确定)。因此,我试图通过Handler实现Messenger,但我知道,一旦重新创建UI(活动/片段被销毁和创建),该方法将无法重新连接到正在进行的上传/下载。基本上,对Handler的引用与之前的活动/片段一起丢失,因此消息不会被传递到UI进行更新。

有一段时间以来我一直在努力想办法,但我没能把它做完。你的至理名言会很有帮助的。

使用接口如何?UI:获取实例和setCallback()时,活动/片段创建,服务:获取实例和调用更新(使用一个处理程序,如果没有从主线程调用,处理程序。帖子(runnable{…更新 ...})).

如果你想通知多个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() {
    }
}

我将以稍微不同的方式处理这个问题,因为消息的排序可能是各种消息解决方案的问题。

在30%事件之后获得40%事件的事实并不是真正的问题。是什么是一个问题,如果你更新UI,以反映30%。

让每个事件(当使用LocalBroadcastManager作为事件总线时,每个Intent)包含时间戳和百分比完成。在UI中跟踪最后一次看到的事件时间戳。如果您得到的事件时间比上次看到的事件时间早,请忽略该事件。

如果你确定你的百分比是单调递增的—换句话说,不存在将完成度从40%降至30%的合理情况。您可以跳过时间戳,只应用比当前显示的百分比更高的新百分比。

如果你想不断更新你的ui,那么我们可以从一个服务中启动一个本地广播管理器,并在你的活动中注册你的广播接收器

最新更新