1

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

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

  1. 选择IntentService在后台运行: 根据链接,我无法使用绑定服务,因为绑定的 Activity/Fragment 被销毁时它会销毁。因此选择了IntentServiceover Service。将它移过去一次,意图服务在工作线程上工作,所以它会好得多。
  2. 广播以接收更新:通过注册它以侦听从上述LocalBroadcastManager接收到的广播来更新进度条 UI 的 实现。IntentService

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

不维护广播顺序。广播携带上传/下载的进度百分比。但是由于没有维护顺序,我有可能收到过时的更新(例如:我可能会在 40% 之后收到 30%)。我也尝试过使用sendBroadcastSyncthe 方法,LocalBroadcastManager但它不能始终如一地工作(我对此不太确定)。因此,我尝试通过实现MessengerHandler但是我知道一旦重新创建 UI(Activity/Fragment 被销毁和创建),该方法将无法重新连接到正在进行的上传/下载。基本上,对 的引用Handler与先前的活动/片段一起丢失,因此消息不会传递到 UI 进行更新。

一段时间以来,我一直在努力解决问题,但我无法完成。你的智慧之言会很有帮助。

4

3 回答 3

2

如何使用接口。UI:在创建活动/片段时获取实例和 setCallback(),服务:获取实例并调用更新(如果未从主线程调用,则使用处理程序,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() {

    }
}
于 2015-06-03T04:19:18.160 回答
1

如果您想不断更新您的用户界面,那么我们可以从服务启动本地广播管理器并在您的活动中注册您的广播接收器。

于 2015-06-03T05:30:07.110 回答
1

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

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

让每个事件(每个用作事件总线IntentLocalBroadcastManager)都包含一个时间戳以及完成百分比。在您的 UI 中跟踪上次看到的事件时间戳。如果您收到的事件早于您上次看到的事件时间戳,请忽略该事件。

如果你确定你的百分比是单调递增的——换句话说,不存在你可能从 40% 下降到 30% 的合理场景——你可以跳过时间戳,只应用高于你的百分比的新百分比当前显示的百分比。

于 2015-07-14T13:37:08.507 回答