如何使用带有EventBus的呼叫类型

当我从服务器获得响应时,我正在使用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();
    }

如何区分onEvent()callType 。 一些指导是必需的。 非常感谢。


一种选择是将你需要的两部分数据包装到一个类中,并将其传递给事件总线。 为了简洁起见,请留下私人成员,获取者/设置者和构造者。

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)) {
     // ...
  }

}

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

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

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

链接地址: http://www.djcxy.com/p/94005.html

上一篇: How to use Call Type with EventBus

下一篇: Scala stackable traits