2016-11-12 2 views
7

Я использую EventBus для уведомления Activity/Fragment, когда я получаю ответ от сервера. Все работает до сих пор, но проблема возникает, когда я потребляю два сетевых вызова в одном Fragment или Activity. Проблема в том же методе onEvent(String response) получает вызовы для обоих ответов с сервера. Ответ call 1 отличается от call 2.Как использовать Тип вызова с EventBus

Я придумал решение - я добавил CallType в NetworkReqest, но я не могу сообщить об активности/фрагменте о сетевом вызове с 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 Здесь возникает проблема, когда после получения ответа от одного запроса я уволить еще один запрос, который зависит от откоса первого запроса

@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

Один из вариантов состоит в том, чтобы обернуть две части данных, которые вам нужны, в класс и передать это на шину событий. Оставляя закрытых членов, геттеры/сеттеры и конструкторы для краткости.

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

Сериализация ответ строки в Java Bean в методе 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); 
     } 
    } 

и вы можете иметь второй, другой, подписки String. Но так как вы собираетесь сделать второй вызов в любом случае, было бы лучше выполнить его непосредственно после получения правильного ответа от первого.

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

излишни, это как не имеющие состояния.