2016-11-12 6 views
7

के साथ कॉल प्रकार का उपयोग कैसे करें मैं सर्वर से प्रतिक्रिया प्राप्त करते समय Activity/Fragment को सूचित करने के लिए EventBus का उपयोग कर रहा हूं। सबकुछ अब तक अच्छा काम करता है, लेकिन समस्या तब उत्पन्न होती है जब मैं दो Fragment या Activity में दो नेटवर्क कॉल का उपभोग करता हूं। समस्या एक ही विधि है onEvent(String response) सर्वर से दोनों प्रतिक्रियाओं के लिए कॉल प्राप्त करें। call 1 की प्रतिक्रिया call 2 से अलग है।इवेंटबस

मैं एक समाधान के साथ आया - मैंने CallTypeNetworkReqest में जोड़ा लेकिन post() केवल एक पैरामीटर लेता है, इसलिए मैं नेटवर्क कॉल के बारे में गतिविधि/खंड को सूचित नहीं कर सकता।

यहाँ प्रासंगिक कोड है -

public class NetworkRequest { 
    EventBus eventBus = EventBus.getDefault(); 

    public void stringParamRequest(String url, final Map<String, String> params,String callType) { 
     StringRequest jsonObjRequest = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         eventBus.post(response); 
        } 
       }, new Response.ErrorListener() { 

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

      @Override 
      public String getBodyContentType() { 
       return "application/x-www-form-urlencoded; charset=UTF-8"; 
      } 

      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       Map<String, String> param = params; 
       return param; 
      } 

     }; 
     SkillSchoolApplication.get().addToRequestQueue(jsonObjRequest); 
    } 

    public void stringRequest(String url, String callType) { 
     StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       eventBus.post(response); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     SkillSchoolApplication.get().addToRequestQueue(stringRequest); 
    } 


} 

fragment/activity यहाँ अंदर विधि है जब एक अनुरोध से प्रतिक्रिया प्राप्त करने के बाद मैं एक और अनुरोध है जो पहले अनुरोध के respose की निर्भर है आग समस्या उत्पन्न होती हैं

@Subscribe(threadMode = ThreadMode.MAIN) 
    public void onEvent(String response) { 
     Log.d(TAG, response); 
     boolean isCourseAvaible = false; 
     if (!isCourseAvaible) { 
      isCourseAvaible = true; 
      List<CoursesDTO> coursesDTOs = AppMgr.coursesMgr(response); 
      String[] ids = new String[0]; 
      String id; 
      if (coursesDTOs != null) { 
       ids = new String[coursesDTOs.size()]; 
       for (int i = 0; i < coursesDTOs.size(); i++) { 
        ids[i] = coursesDTOs.get(i).getListId(); 

       } 
      } 
      id = TextUtils.join(",", ids); 
      Map<String, String> map = new HashMap<>(); 
      map.put("part", "snippet,contentDetails"); 
      map.put("playlistId", id); 
      map.put("key", AppConstants.YOUTUBE_KEY); 
      NetworkRequest networkRequest = new NetworkRequest(); 
      networkRequest.stringParamRequest("some url", map); 
     } else { 
      Log.d(TAG, response); 
     } 

    } 

    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onEvent(VolleyError error) { 
     Log.d(TAG, error.toString()); 
     Toast.makeText(getActivity(), "Something went wrong " + error.toString(), Toast.LENGTH_SHORT).show(); 
    } 

onEvent() के भीतर मैं callType को कैसे अलग कर सकता हूं। कुछ मार्गदर्शन की आवश्यकता है। बहुत धन्यवाद।

उत्तर

3

एक विकल्प आपको कक्षा में आवश्यक डेटा के दो टुकड़ों को लपेटना है और ईवेंट बस में भेजना है। निजी सदस्यों, गेटर्स/सेटर्स और ब्रेवटी के लिए कन्स्ट्रक्टर छोड़ना।

class NetworkResponse() { 
    public String callType; 
    public String response; 
} 

जब आप एक प्रतिक्रिया मिल, एक NetworkResponse आवंटित और प्रतिक्रिया और कॉल प्रकार और post कि घटना बस के साथ पॉप्युलेट करें।

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onEvent(NetworkResponse networkResponse) { 
    if(networkResponse.callType.equals(CALL_1)) { 
    // ... 
    } else if (networkResponse.callType.equals(CALL_2)) { 
    // ... 
    } 

} 
+0

मैं ऐसा करने के बारे में सोच रहा था, लेकिन मैंने सोचा कि इससे कुछ बेहतर समाधान हो सकता है। –

1

onResponse विधि में एक जावा सेम करने के लिए स्ट्रिंग प्रतिक्रिया को क्रमानुसार, और विचारों को सही वस्तु का उत्सर्जन। क्रियाकलापों, टुकड़ों और दृश्यों को क्रमबद्धता के बारे में जानने की आवश्यकता नहीं है, और इसके अलावा, आपके ऐप का प्रदर्शन बेहतर हो सकता है, क्योंकि आप पृष्ठभूमि थ्रेड में डेटा को क्रमबद्ध करने के लिए अपना कोड संशोधित कर सकते हैं।

public void stringRequest(String url, String callType) { 
     StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       eventBus.post(AppMgr.coursesMgr(response)); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     SkillSchoolApplication.get().addToRequestQueue(stringRequest); 
    } 

फिर अपने पहली घटना सदस्यता इस तरह दिखेगा:

@Subscribe(threadMode = ThreadMode.MAIN) 
    public void onEvent(List<CoursesDTO> coursesDTOs) { 
     Log.d(TAG, response); 
     boolean isCourseAvaible = false; 
     if (!isCourseAvaible) { 
      isCourseAvaible = true; 
      String[] ids = new String[0]; 
      String id; 
      if (coursesDTOs != null) { 
       ids = new String[coursesDTOs.size()]; 
       for (int i = 0; i < coursesDTOs.size(); i++) { 
        ids[i] = coursesDTOs.get(i).getListId(); 
       } 
      } 
      id = TextUtils.join(",", ids); 
      Map<String, String> map = new HashMap<>(); 
      map.put("part", "snippet,contentDetails"); 
      map.put("playlistId", id); 
      map.put("key", AppConstants.YOUTUBE_KEY); 
      NetworkRequest networkRequest = new NetworkRequest(); 
      networkRequest.stringParamRequest("some url", map); 
     } else { 
      Log.d(TAG, response); 
     } 
    } 

और आप एक दूसरे, अलग, स्ट्रिंग सदस्यता हो सकता है। लेकिन चूंकि आप दूसरी कॉल करने जा रहे हैं, इसलिए पहले व्यक्ति से सही उत्तर प्राप्त करने के बाद इसे सीधे निष्पादित करना सबसे अच्छा होगा।

public class NetworkRequest { 
    EventBus eventBus = EventBus.getDefault(); 

    public void stringParamRequest(String url, final Map<String, String> params,String callType) { 
     StringRequest jsonObjRequest = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         eventBus.post(response); 
        } 
       }, new Response.ErrorListener() { 

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

      @Override 
      public String getBodyContentType() { 
       return "application/x-www-form-urlencoded; charset=UTF-8"; 
      } 

      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       Map<String, String> param = params; 
       return param; 
      } 

     }; 
     SkillSchoolApplication.get().addToRequestQueue(jsonObjRequest); 
    } 

    public void stringRequest(String url, String callType) { 
     StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       List<CoursesDTO> coursesDTOs = AppMgr.coursesMgr(response); 
       String[] ids = new String[0]; 
       String id; 
       if (coursesDTOs != null) { 
       ids = new String[coursesDTOs.size()]; 
       for (int i = 0; i < coursesDTOs.size(); i++) { 
        ids[i] = coursesDTOs.get(i).getListId(); 

       } 
       } 
       id = TextUtils.join(",", ids); 
       Map<String, String> map = new HashMap<>(); 
       map.put("part", "snippet,contentDetails"); 
       map.put("playlistId", id); 
       map.put("key", AppConstants.YOUTUBE_KEY); 
       NetworkRequest networkRequest = new NetworkRequest(); 
       networkRequest.stringParamRequest("some url", map);     
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     SkillSchoolApplication.get().addToRequestQueue(stringRequest); 
    } 
} 

अंत में, इस दो पंक्तियों

boolean isCourseAvaible = false; 
     if (!isCourseAvaible) { 

ज़रूरत से ज़्यादा हैं, कोई शर्त होने की तरह है।

संबंधित मुद्दे