1

基本的に Android では、Web サービスからデータをアップロード/ダウンロードしようとしており、進行状況のパーセンテージを示す進行状況バーをレンダリングする必要があります。

以下は、それらを検討する理由とともに私が実装したアプローチです。

  1. バックグラウンドIntentServiceで実行することを選択しました:リンクに よると、バインドされたアクティビティ/フラグメントが破棄されると破棄されるため、バインドされたサービスを使用できませんでした。したがって、IntentService以上の選択Service。移動は1回で、インテントサービスはワーカースレッドで機能するため、はるかに優れています。
  2. 更新を受信するブロードキャスト:上記LocalBroadcastManagerから受信したブロードキャストをリッスンするように登録して、プログレス バー UI を更新する 実装。IntentService

ただし、このアプローチでは、次の問題に対処する必要があります。

ブロードキャストの順序は維持されません。ブロードキャストには、アップロード/ダウンロードの進行状況のパーセンテージが含まれます。しかし、順序が維持されていないため、古い更新を受信する可能性があります (例: 40% の後に 30% を受信する場合があります)。sendBroadcastSyncの方法も試してみましたLocalBroadcastManagerが、一貫して機能しません(これについてはよくわかりません)。したがって、私はMessenger経由で実装しようとしHandlerましたが、UI が再作成されると (Activitiy/Fragment が破棄されて作成されます)、進行中のアップロード/ダウンロードに再接続できないことがわかりました。基本的に、への参照Handlerは前のアクティビティ/フラグメントとともに失われるため、メッセージは更新のために UI に配信されません。

私はしばらくの間、自分の道を歩もうとしてきましたが、それを成し遂げることができません。あなたの知恵の言葉はとても役に立ちます。

4

3 に答える 3

2

インターフェイスを使用するのはどうですか。UI: アクティビティ/フラグメントが作成されたときにインスタンスを取得して setCallback()、サービス: インスタンスを取得して update を呼び出します (メイン スレッドから呼び出されない場合はハンドラーを使用する、handler.post(runnable {... update ...}))。

複数の UI インスタンスに通知する場合は、アップデータ クラスに 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

UI を常に更新したい場合は、サービスからローカル ブロードキャスト マネージャーを開始し、ブロードキャスト レシーバーをアクティビティに登録できます。

于 2015-06-03T05:30:07.110 に答える