2015-12-22 7 views
5

私はvolleyライブラリの待機リクエスト機能に問題があります。デバッグはjava.utilのAbstractQueueクラスに導かれました。ここでは、要素が追加されています(メソッドのいくつかの値に応じてキューへの追加が成功したことを示します)。同時に追加されません(キューの0要素 - それは価値を変えない)。追加方法は同期されています。ベローには、これまでの状況と私の研究の詳細な説明があります。もしあなたが何か起きていることが分かっていれば、あなたは彼らを見て分かち合い、本当に感謝しています。Volleyライブラリ(PriorityBlockingQueue.java)内のリクエスト要求機能の問題

何らかのエラーが発生したときに自動的にリクエストを再試行します(たとえば、接続がない場合、またはサーバー名が正しくない場合など)。 リクエストのエラーハンドラは、リクエストをアプリケーションのスタティックシングルトンRequestQueueに戻します。

RetriableRequestWraper.java

m_request = new StringRequest(
      method, 
      url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        handleResponse(response); 
       } 
      }, 

      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError volleyError) { 
        handleError(volleyError); 
       } 
      }); 

public void handleError(VolleyError volleyError) 
{ 
    Log.d("Request: ", m_request.toString()); 
    Log.d("handleError: ", volleyError.toString()); 
    if(retriesCount<3) 
    { 
     executeRequest(); 
     ++retriesCount; 
    } 
    else 
    { 
     retriesCount = 0; 
    } 
} 

public void executeRequest() 
{ 
    RequestsManager.getInstance().executeRequest(m_request); 
} 

public void executeRequest(Request request) 
{ 
    Log.d("executeRequest ","m_requestQueue.add(request)"); 
    m_requestQueue.add(request); 
} 

RequestManager.java

public void executeRequest(Request request) 
{ 
    Log.d("executeRequest ","m_requestQueue.add(request)"); 
    m_requestQueue.add(request); 
} 

このアプローチは動作しませんし、ボレーライブラリ内でデバッグするときに、私は、要求が追加することができませんでした地点に来てreuqestのcacheKeyがmWaitingRequests Mapに存在するため、RequestQueueクラスのmCacheQueueその要求は、そのキーに対応するmWaitingRequestsマップのキューに追加されます。以前の要求が終了したとき - これらの行はREQUESTQUEUEクラスで実行されているが新しいものをキューに追加されない:

synchronized(this.mWaitingRequests) { 
      String cacheKey1 = request.getCacheKey(); 
      Queue waitingRequests1 = (Queue)this.mWaitingRequests.remove(cacheKey1); 
      if(waitingRequests1 != null) { 
       if(VolleyLog.DEBUG) { 
        VolleyLog.v("Releasing %d waiting requests for cacheKey=%s.", new Object[]{Integer.valueOf(waitingRequests1.size()), cacheKey1}); 
       } 

       this.mCacheQueue.addAll(waitingRequests1); 
      } 
     } 

AbstractQueueでさらに行をデバッグ

this.mCacheQueue.addAll(waitingRequests1); 

。要素がキューに追加されているjava(classのjava.util)、 "変更された"値はtrueですが、ホール時間を通して "this"パラメータには引き続き0要素が含まれます。 PriorityBlockingQueue.javaの提供(E E)メソッド内

public boolean addAll(Collection<? extends E> c) { 
    if (c == null) 
     throw new NullPointerException("c == null"); 
    if (c == this) 
     throw new IllegalArgumentException("c == this"); 
    boolean modified = false; 
    for (E e : c) 
     if (add(e)) 
      modified = true; 
    return modified; 
} 

プログラムの実行が453

l452 siftUpUsingComparator(n, e, array, cmp); 
l453 size = n+1; 

行で停止明らかに返される値はtrueですが、要素が追加されません。私のデバッガは、要素を追加するメソッドに入ることができませんでした - siftUpUsingComparator(n、e、array、cmp);

リクエストを再試行する前にタイマーを追加して、新しいタイマーを作成します。だから私は本当に回避策に興味がない、私はこの状況で何が起こっているのか理解したい。あなたはこれの背後にある理由が何であるかについて考えていますか?

答えて

1

問題は、追加されたキューに同じRequestインスタンスをもう一度追加しようとしていることです。これは、状態を持つので、キューと要求自身を混乱させます。たとえば、単にマーカーを有効にすると、クラッシュすることになります。解決策は、デフォルトの再試行ポリシーを使用するか、要求を複製することだけです。