2017-07-06 3 views
1

私に助けていただけると感謝しています。私は以下の問題を抱えています:Androidのボレー - すべてのリクエストが完了したときにコールバックを受け取る

SyncAdapterを使用して、定期的かつ手動でローカルデータベースをサーバーデータと同期させるアプリケーションがあります。しかし、ユーザーがアプリケーションにただちにログインしようとしているときは、ロードダイアログが表示されている間に手動同期が実行されている必要があります。同期が完了したら、ダイアログを非表示にしてメインアクティビティを表示する必要があります。何をお勧めしますか?

私は、HTTPリクエストを処理するためにvolleyを使用しています。私はちょっと混乱しています。要求は常に非同期的に実行されるため、すべての要求が終了してダイアログを非表示にするのを知ることは難しいです。次のように

コードは次のとおりです。私の英語レベルについて

VolleySingleton.getInstance(getContext()).addToRequestQueue(
     new JsonObjectRequest(
      Request.Method.GET, 
      Constants.GET_URL, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        // This method sync the data 
        updateLocalData(response, syncResult); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        getContext().sendBroadcast(new Intent(Constants.SYNC_CORRUPTED_BY_SERVER)); 
        Log.d(TAG, "Sync (makeLocalSync), Exception => " + 
          error.getLocalizedMessage()); 
       } 
      } 
     ) 
    ); 

申し訳ありません...

ありがとう!

+0

後で "n"リクエストがあるとします。その他 "n" VolleySingleton.getInstance(getContext())。 AddToRequestQueue(... –

答えて

2

残念ながら、VolleyのRequestQueueは、保留中のリクエストがすべて終了したときに通知するためのインターフェイスもコールバックも提供しません。すべてのリクエストが完了したときに通知するための回避策は、すべてのリクエストの応答に対してintおよびbooleanクラスメンバーを更新するか、失敗することです。リクエストはこれらのメンバーにアクセスできることが重要で、数字も更新された値に対応するため、この値が0になると、すべてのリクエストが完了したことがわかります。その後

private int numberOfRequestsToMake = NUMBER; 
private boolean hasRequestFailed = false; 

、リクエストを作成する場合:

次のように私は私の問題を解決した
JsonObjectRequest req = new JsonObjectRequest(url, null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.d(TAG, "successful request to " + url); 
        numberOfRequestsToMake--; 

        if(numberOfRequestsToMake == 0) { 
         if(!hasRequestFailed) { 
          //All requests finished correctly 
         } else { 
          //At least one request failed 
         } 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e(TAG, "unsuccessful request to " + url); 
        numberOfRequestsToMake--; 
        hasRequestFailed = true; 

        if(numberOfRequestsToMake == 0) { 
         //The last request failed 
        } 
       } 
      } 
    ); 

    MyVolleySingleton.getInstance().addToRequestQueue(req); 
-1

:その方法Response.Listener内、 "n" はバレーボール要求のそれぞれにおいて

Respones.ErrorListener私はカウンタフラグを使用します

カウンタの値が要求の数と等しい場合、すべての要求が完了している場合、フラグが付いていれば、問題が発生しているかどうかを確認します。

要求#n1の:

// Counter and flag to handle requests 
    private static int iCountRequest; 
    private static boolean bAnyErrors; 
    // Before initiating all the requests, the variables must be restarted 
    iCountRequest = 0; 
    bAnyErrors = false; 
    // Request # n1: 
    VolleySingleton.getInstance(getContext()).addToRequestQueue(
      new JsonObjectRequest(
        Request.Method.GET, 
        Constants.REQUEST_N1_URL, 
        new Response.Listener<JSONObject>() { 
         @Override 
         public void onResponse(JSONObject response) { 
          iCountRequest++; 
          // Response code.. 
          sendBroadcastToActivity(); 
         } 
        }, 
        new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          iCountRequest++; 
          bAnyErrors = true; 
          sendBroadcastToActivity(); 
         } 
        } 
      ) 
    ); 

sendBroadCast機能を次のように

コードがある

if (iCountRequest == Constants.NUMBER_OF_REQUEST) { 
     if (!bAnyErrors) { 
      getContext().sendBroadcast(new Intent(Constants 
        .SYNC_IN_ORDER_FINISHED)); 
     } else { 
      getContext().sendBroadcast(new Intent(Constants 
        .SYNC_IN_ORDER_FINISHED_WITH_ERRORS)); 
     } 
    } 

VolleySingleton:

public final class VolleySingleton { 

    private static VolleySingleton oSingleton; 
    private RequestQueue oRQ; 
    private static Context oContext; 

    private VolleySingleton(Context context) { 
     VolleySingleton.oContext = context; 
     oRQ = getRequestQueue(); 
    } 

    public static synchronized VolleySingleton getInstance(Context context) { 
     if (oSingleton == null) { 
      oSingleton = new VolleySingleton(context.getApplicationContext()); 
     } 
     return oSingleton; 
    } 

    private RequestQueue getRequestQueue() { 
     if (oRQ == null) { 
      oRQ = Volley.newRequestQueue(oContext.getApplicationContext()); 
     } 
     return oRQ; 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     getRequestQueue().add(req); 
    } 

} 

私はそれがあなたのために働く願っています。ありがとう@FerDensetsu

関連する問題