2016-09-21 66 views
1

在我的应用程序中,我需要按顺序发送多个抽签请求。 我已经创建了一个处理排球反应的公共监听器。如何在一个序列中发送多个抽签请求并在单个收听者中处理它们

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

并注册使用方法,这个回调:

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

我已经创造了一种凌空请求处理的常用方法。

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(); 
    } 
} 

我叫从一类这个方法为:

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

而且我overrided的RequestCallBack接口方法。 但是里面的onSuccess方法每次返回第二个请求的标签。

@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) { 

} 

任何人都可以在这里建议我如何解决这个问题。

在此先感谢。

+0

嘿,我还创建了一个通用的方法使用和截击发送请求。如果你需要我可以发布我的方法单身对象方法 –

+0

我已经使用单身类创建请求队列。 –

+0

您能否区分您获得的结果是从哪项服务中进行回收? –

回答

3

应用类

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); 
    } 

} 

创建一个枚举所以,你可以设置每当你会打任何要求像下面的任何值。

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

我已经创建了一个用于在服务器上发送请求的公共类。

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; 
    } 

} 

创建,你必须在你想打的请求这些类包括这样就可以得到结果和与CommonUtilities.SERVICE_TYPE帮助下,你会知道,结果从业务接入的接口

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

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

试试吧,我用这个方法在我的项目和它完美的作品对我来说...如果需要任何帮助,让我知道....

+0

是否有必要使用枚举实现它,我们可以通过使用字符串名称来实现它吗? –

+0

在大型产品enum证明更好,易于实现,因为你可以重用他们,而如果我认为字符串,将工作,但不知道多少成功,将是...而不是枚举你可以传递字符串和mae单独的类,并采取字符串作为常量..如果你想申请这个,我可以帮助你应用这个 –

+0

我已经通过使用整数常量(内存消耗的好处)来实现它。 非常感谢你对我的帮助很大。 –

相关问题