2016-09-21 3 views
1

In meiner Anwendung muss ich mehrere Volley-Anfrage in einer Sequenz senden. Ich habe einen gemeinsamen Listener für den Umgang mit der Volley-Antwort erstellt.So senden Sie mehrere Volley-Anfragen in einer Sequenz und behandeln sie in einem einzigen Listener

public interface RequestCallBack { 
    void onSuccess(JSONObject jsonObject, String tag) 
    void OnError(String message); 
} 

Und registriert diesen Callback-Methode:

public void setOnResponseListener (RequestCallBack onResponseListener) { 
    this.onResponseListener = onResponseListener; 
} 

ich eine gemeinsame Methode erstellt haben, in dem Volley Anfrage behandeln.

public void getResponse(String tag, String url) { 
    JsonObjectRequest jsonObjectRequest; 
    try { 

     jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, 
       url,null, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 

       try { 
        mStatusCode = response.optInt("status_code"); 
        mBody = response.optJSONObject("body"); 
        if (mStatusCode != 0 && mStatusCode == 201) { 
         onResponseListener.onSuccess(mBody, (String) jsonObjectRequest.getTag()); 
        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 

       } 

      } 

     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       onResponseListener.OnError(displayVolleyError(error)); 
      } 
     }) { 
      @Override 
      protected VolleyError parseNetworkError(VolleyError volleyError) { 
       if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) { 
        volleyError = new VolleyError(new String(volleyError.networkResponse.data)); 
       } 

       return volleyError; 
      } 
     }; 

     jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(
       REQUEST_TIMEOUT_MS, 
       NO_OF_RETRY_ATTEMPTS, 
       BACK_OF_MULTIPLIER)); 
     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(jsonObjectRequest, tag); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Ich habe diese Methode aus einer Klasse wie genannt:

classObject.getResponse("request1", firstUrl); 
    classObject.getResponse("request2", secondUrl); 

Und ich habe die RequestCallBack Interface-Methoden overrided. Aber innerhalb der onSuccess Methode jedes Mal das Tag der zweiten Anfrage zurückgegeben wird.

@Override 
public void onSuccess(JSONObject jsonObject, String tag) { 
    Log.d("Class", "tag: "+tag); // Always returns the "request2" 
    // Will check service response according to tag 
    // but didn't get the right tag. 
} 

@Override 
public void OnError(String message) { 

} 

Kann mir jemand hier vorschlagen, wie Sie dieses Problem lösen.

Vielen Dank im Voraus.

+0

hey ich habe auch ein gemeinsames Konzept erstellt Volley für die Verwendung und Senden von Anfragen. Wenn Sie brauchen, kann ich meinen Ansatz mit Singleton-Objektansatz –

+0

posten Ich verwende bereits die Singleton-Klasse für die Erstellung der Anfrage-Warteschlange. –

+0

Können Sie unterscheiden, dass das Ergebnis, das Sie erhalten, von welchem ​​Service stammt? –

Antwort

3

Anwendungsklasse

import android.app.Application; 
import android.text.TextUtils; 

import com.android.volley.RequestQueue; 
import com.android.volley.toolbox.Volley; 

/** 
* Created by Preetika on 7/4/2016. 
*/ 
public class App extends Application { 

    private static App mInstance; 
    public static final String TAG = App.class 
      .getSimpleName(); 
    private RequestQueue mRequestQueue; 
    public App() { 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 


    } 
    public static synchronized App getmInstance(){return mInstance;} 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
     } 

     return mRequestQueue; 
    } 
    public <T> void addToRequestQueue(com.android.volley.Request<T> req, String tag) { 
     // set the default tag if tag is empty 
     req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 
     getRequestQueue().add(req); 
    } 

} 

eine Enum erstellen, damit Sie einen beliebigen Wert einstellen kann, wann immer Sie wie unten jede Anfrage getroffen werden.

public static enum SERVICE_TYPE{ 
     //set enums here for example you are hitting request for login 
     LOGIN 
    } 

Ich habe eine gemeinsame Klasse für das Senden von Anforderungen auf dem Server erstellt.

import android.content.Context; 
import android.os.AsyncTask; 
import android.util.Log; 

import com.acadgild.android.volley.App; 
import com.acadgild.android.volley.utils.CommonUtilities; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.StringRequest; 

import java.util.Map; 

/** 
* Created by Preetika on 6/17/2016. 
*/ 
public class CallAddrVolley extends AsyncTask<Void, Void, Void> { 

    private static String TAG= "CallAddr"; 
    Context context; 
    Map<String, String> paramss; 
    OnWebServiceResult resultListener; 
    CommonUtilities.SERVICE_TYPE Servicetype; 
    String url; 
    int method; 
    private String tag_json_obj = "jobj_req"; 


    public CallAddrVolley(Context context, Map<String, String> params, int method, String url, CommonUtilities.SERVICE_TYPE Servicetype, OnWebServiceResult resultListener){ 
     this.context= context; 
     this.paramss = params; 
     this.url= url; 
     this.resultListener= resultListener; 
     this.Servicetype= Servicetype; 
     this.method= method; 
     Log.e("size", "size= "+ paramss.size()); 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 
    /* JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, 
       url, null, 
       new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject response) { 
         Log.d(TAG, response.toString()); 
         try { 
          resultListener.getWebResponse(response.toString(), Servicetype); 
         }catch (Exception e){ 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      } 
     }) { 

      *//** 
      * Passing some request headers 
      * *//* 
      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       HashMap<String, String> headers = new HashMap<String, String>(); 
       headers.put("Content-Type", "application/json"); 
       return headers; 
      } 

      @Override 
      protected Map<String, String> getParams() { 
       Log.e("params", "params= "+ paramss.size()); 
       Log.e("params", "params= "+ paramss.get(Constants.USER_ID)); 
       return paramss; 
      } 

     };*/ 
     StringRequest myReq = new StringRequest(method, 
       url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         Log.e(TAG, response.toString()); 
         try { 
          resultListener.getWebResponse(response.toString(), Servicetype); 
         }catch (Exception e){ 
          e.printStackTrace(); 
         } 

        } 
       }, 
       new Response.ErrorListener() { 

        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        } 
       }) { 

      protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { 

       Log.e("params", "params= "+ paramss.size()); 
       Log.e(TAG, "Url= "+ url+ paramss.toString()); 
       return paramss; 
      }; 
     }; 
     // Adding request to request queue 
     App.getmInstance().addToRequestQueue(myReq, 
       tag_json_obj); 
     return null; 
    } 

} 

Eine Schnittstelle, die Sie in diesen Klassen gehören, wo Sie Anfrage treffen wollen, so dass Sie und mit Hilfe von CommonUtilities.SERVICE_TYPE Ergebnis erhalten Sie wird kommen, dass Ergebnis zu wissen, aus dem Dienst kommen

import com.acadgild.android.volley.utils.CommonUtilities; 

    /** 
    * @author Preetika 
    * 
    */ 
    public interface OnWebServiceResult { 
     public void getWebResponse(String result, CommonUtilities.SERVICE_TYPE type); 
    } 

Probieren sie es ich bin mit diesem Ansatz in meinen Projekten und es funktioniert perfekt für mich ... Wenn jede Hilfe benötigt wird, lassen sie mich wissen ....

+0

Ist es notwendig, es mit enum zu implementieren, können wir es erreichen, indem Sie einen String-Namen verwenden? –

+0

auf großen Produkten Enum erweist sich besser und einfach zu implementieren, wie Sie sie wiederverwenden können, wenn ich jedoch Zeichenfolge, die funktioniert, aber nicht sicher, wie viel Erfolg es wäre ... statt Enum können Sie String und Mae separaten Klasse übergeben und nehmen Zeichenketten als Konstanten. Wenn Sie dieses anwenden möchten, kann ich Ihnen helfen, dieses auch anzuwenden –

+0

Ich habe es unter Verwendung der Ganzzahlkonstante eingeführt (Vorteil des Speicherverbrauchs). Vielen Dank es hilft mir sehr. –

Verwandte Themen