2016-11-12 12 views
7

サーバーから応答を受け取ったときにEventBusを使用してActivity/Fragmentに通知しています。これまでのところすべてうまくいきますが、同じFragmentまたはActivityで2つのネットワークコールを消費すると問題が発生します。問題は同じ方法ですonEvent(String response)サーバからの両方の応答の呼び出しを取得します。 call 1の応答はcall 2とは異なります。EventBusでコールタイプを使用する方法

私は解決策を思いついた - 私はNetworkReqestCallTypeを追加しましたが、post()は1つのパラメータしか取らないので、ネットワークコールに関するアクティビティ/フラグメントを通知できません。ここで

は、関連するコードです - つの要求からの応答を取得した後、私は最初の要求のresposeの依存している別の要求を発射する際に問題が発生する。ここ fragment/activityインサイド

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


} 

方法

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

callTypeはどのように区別できますか?onEvent()です。いくつかのガイダンスが必要です。どうもありがとう。

答えて

3

1つのオプションは、必要な2つのデータをクラスにラップし、それをイベントバスに渡すことです。プライベートメンバー、getters/setter、コンストラクタを省略して簡潔にします。あなたが応答を取得すると

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メソッドのJava Beanに対するStringレスポンスをシリアル化し、ビューに適切なオブジェクトを出力します。アクティビティ、フラグメント、およびビューは、シリアル化について知る必要はなく、また、コードを変更してバックグラウンドスレッドのデータをシリアル化することができるため、アプリケーションのパフォーマンスが向上する可能性があります。

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

、あなたは、第二の、異なる、文字列のサブスクリプションを持つことができます。しかし、とにかく2番目の呼び出しを行うつもりなので、最初の呼び出しから正しい答えを得た後に直接実行するのが最善です。

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

は不要であり、この二行

は、全く症状を有していないようです。

関連する問題