1

Ich habe eine Android-Anwendung mit mehreren REST Api's. Die APIs werden mithilfe der Volley-Bibliothek verwaltet. Die Antwort bekommt und es ist gut. Aber wenn ich asynchrone Anfragen mache, kann ich die Antwort jeder Anfrage nicht identifizieren.Wie setze ich Tag auf die Anfrage und bekomme es von Response Volley asynchrone Anfrage?

ist mein Wunsch Methode dies:

private void httpCall(String URL, String json, String session key, int type) { 
     try { 
      SSLContext sslcontext = SSLContext.getInstance("TLSv1"); 
      sslcontext.init(null, 
        null, 
        null); 
      SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(sslcontext.getSocketFactory()); 
      HttpsURLConnection.setDefaultSSLSocketFactory(NoSSLv3Factory); 

      Log.i(REQUEST_TAG, "httpCall=url" + url + "::type" + type); 
      Log.i(REQUEST_TAG, "httpCall=json" + json); 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
     if (mContext != null) 
      mQueue = CustomVolleyRequestQueue.getInstance(mContext).getRequestQueue(); 
     else 
      mQueue = CustomVolleyRequestQueue.getInstance(mActivity).getRequestQueue(); 
     JSONObject mJSONObject; 
     final CustomJSONObjectRequest jsonRequest; 
     try { 
      if ((json != null) && (json.trim().length() > 0)) { 
       mJSONObject = new JSONObject(json); 
      } else { 
       mJSONObject = new JSONObject(); 
      } 
      jsonRequest = new CustomJSONObjectRequest(sessionkey, type, url, mJSONObject, this, this); 
      // Wait 20 seconds and don't retry more than once 
      jsonRequest.setRetryPolicy(new DefaultRetryPolicy(
        (int) TimeUnit.SECONDS.toMillis(20), 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

      jsonRequest.setTag(REQUEST_TAG); 
      mQueue.add(jsonRequest); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

Gibt es eine Möglichkeit, einen Tag auf die Anforderung zu setzen und dies auch von der Antwort zu bekommen ?. Damit kann ich die aktuelle Anfrage und Antwort identifizieren. Ich weiß nicht, dass das eine doppelte Frage ist, aber ich habe keine richtige Erklärung dafür bekommen.

Meine Antwort Methode ist:

@Override 
    public void onResponse(Object response) { 
     if (response != null) { 

      // I want to trigger the request tag from here 

      mCallBack.onSuccessData(response); 
     } 
    } 

Die Anfrage- und Antwortverfahren in derselben Klasse und der Klasse implementiert Response.Listener, Response.ErrorListener.

+0

Ich bin nicht sicher, was Sie für Tags zu verwenden versuchen, aber Wo implementieren Sie die onResponse-Methode? –

+0

Ich ändere meine Frage. Die Request- und Response-Methoden sind in derselben Klasse und ich möchte ein Tag/Schlüssel in der Anfrage setzen und dasselbe auf die Antwort auslösen. – Nithinjith

+0

auslösen die gleichen Mittel ?? Tags in Volley werden verwendet, um das Anfrageobjekt zu verweisen. Die Anfrage wurde für die Antwortmethode bereits abgeschlossen. was machst du jetzt damit? –

Antwort

2

Das Tag, das Sie einer Anforderung zuweisen, wird in der Variablen mTag gespeichert, die während des gesamten Lebenszyklus der Anforderung beibehalten wird.

public Request<?> setTag(Object tag) { 
    mTag = tag; 
    return this; 
} 

Für meine Anwendungen ich etwas haben folgende Volley Klassen geändert:

In der Klasse Antrag Änderung Sichtbarkeit von mTag von privat zu geschützten

/** An opaque token tagging this request; used for bulk cancellation. */ 
    protected Object mTag; 

In der Klasse Antwort, fügen Objekt-Tag an die Rückruffunktion onResponse in der Schnittstelle definiert Listener

/** Callback interface for delivering parsed responses. */ 
public interface Listener<T> { 
    /** Called when a response is received. */ 
    public void onResponse(Object tag, T response); 
} 

In Klassen, die Schnittstelle implementieren Response.Listener, wie JsonRequest

@Override 
protected void deliverResponse(T response) { 
    mListener.onResponse(mTag, response); 
} 
+0

Die gleiche Prozedur kann für die Fehlerreaktion übernommen werden, indem die Interface-ErrorListener-Methode gemäß onErrorResponse geändert wird (ObjectmTag, VolleyError error) – Chebyr

+0

Haben Sie ein Beispiel dafür? –

+0

@Chebyr was ist, wenn Sie es als Graddle-Abhängigkeit enthalten und nicht als Modul. Gibt es auch eine Arbeit um –