2017-03-27 17 views
1

私はAndroidでVolleyのリクエストに問題があります。私はサーバーから学生のバットを取得しようとしていて、各バットノーの詳細に対応した学生の詳細を取得しようとしています。ログにはサーバーからの応答が表示されますが、それらはすべてランダムな順序です。また、レスポンスは、recyclerviewでランダムな順序で設定されています。ここ は、バッチや学生のための私のボレーとJSONです:Volley multiple requests android

private void setData() { 
     students = new ArrayList<>(); 
     StringRequest batchRequest=new StringRequest(Request.Method.POST, BATCH_URL, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        parseBatchJsonResponse(response); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.d("ResponseError",""+error.toString()); 

      } 
     }); 
       VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(studentRequest,"req"); 



    } 

    private void parseBatchJsonResponse(String response) throws JSONException { 
     Log.d("Resp",""+response); 
     JSONObject batchObject=new JSONObject(response); 
     JSONArray batchArray=batchObject.getJSONArray("result"); 
     for (int i=0;i<batchArray.length();i++){ 
      JSONObject bObject=batchArray.getJSONObject(i); 
      batchNos=bObject.getString("batch"); 
      Log.d("batchNo",""+batchNos); 
      getStudentData(batchNos); 



     } 

    } 

    private void getStudentData(String batchNo) { 
     batchNos =batchNo= "\"" + batchNo + "\""; 

     String studentURl=STUDENT_URL+batchNo.trim(); 
     Log.d("SURL",""+studentURl); 

     StringRequest studentRequest =new StringRequest(Request.Method.GET,studentURl, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 

       try { 
        Log.d("Student",""+response+batchNos); 
        parseStudentJson(response); 


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


      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
       VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(studentRequest,"req"); 

    } 

    private void parseStudentJson(String batchNo) throws JSONException { 
//  students.clear(); 
     JSONObject studentOb=new JSONObject(batchNo); 
     JSONArray stuArray=studentOb.getJSONArray("result"); 
     for (int i=0;i<stuArray.length();i++){ 
      JSONObject stu=stuArray.getJSONObject(i); 
      String stuName=stu.getString("student"); 
      students.add(new Student(stuName,100)); 
      Log.d("BNO",""+batchNos); 

     } 
     batches.add(new Batch(batchNos,students)); 
     adapter.notifyDataSetChanged(); 

答えて

0

は、新たな要求を単一の要求キューをqueue.Makeたびをしないでください。

public class VolleySingleton { 
private static VolleySingleton mAppSingletonInstance; 
private RequestQueue mRequestQueue; 
private ImageLoader mImageLoader; 
private static Context mContext; 
private Request.Priority Low; 

private VolleySingleton(Context context) { 
    mContext = context; 
    mRequestQueue = getRequestQueue(); 

    mImageLoader = new ImageLoader(mRequestQueue,new ImageLoader.ImageCache() 
    { 
     private final LruCache<String, Bitmap> 
       cache = new LruCache<String, Bitmap>(20); 

     @Override 
     public Bitmap getBitmap(String url) { 
      return cache.get(url); 
     } 

     @Override 
     public void putBitmap(String url, Bitmap bitmap) { 
      cache.put(url, bitmap); 
     } 
    }); 
} 



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



public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 

     mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext()); 
    } 
    return mRequestQueue; 
} 



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



public ImageLoader getImageLoader() { 
    return mImageLoader; 
} 



public void cancelPendingRequests(Object tag) { 
    if (mRequestQueue != null) { 
     mRequestQueue.cancelAll(tag); 
    } 
} 


} 

その後

VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest,tag); 
+0

なぜそれが問題になることでしょうか? – schlingel

+0

バッチの番号が正しい順序で存在するため、何回も実行する必要がある単一の要求キューがあります。 –

+0

複数のキューを作成すると、非同期で実行されます。実行の要求はありません。 – ak0692