【问题标题】:How to use Call Type with EventBus如何在 EventBus 中使用调用类型
【发布时间】:2016-11-12 07:02:45
【问题描述】:

当我收到来自服务器的响应时,我正在使用 EventBus 通知 Activity/Fragment。到目前为止一切正常,但是当我在同一个FragmentActivity 中使用两个网络调用时会出现问题。问题是相同的方法onEvent(String response) 获取来自服务器的两个响应的调用。 call 1 的响应与call 2 不同。

我想出了一个解决方案 - 我在NetworkReqest 中添加了CallType,但我无法通知有关网络调用的活动/片段,因为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();
    }

如何区分 callTypeonEvent()。需要一些指导。非常感谢。

【问题讨论】:

    标签: android web-services android-fragments event-bus


    【解决方案1】:

    一种选择是将您需要的两条数据包装到一个类中并将其传递给事件总线。为简洁起见,省略了私有成员、getter/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)) {
         // ...
      }
    
    }
    

    【讨论】:

    • 我想这样做,但我认为可能有比这更好的解决方案。
    【解决方案2】:

    在 onResponse 方法中将 String 响应序列化为 java bean,并将正确的对象发送到视图。 Activity、Fragment 和 Views 不需要知道序列化,此外,您的应用程序的性能可以提高,因为您可以修改代码以在后台线程中序列化数据。

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

    都是多余的,就像没有条件一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多