Android使用EventBus框架优化代码逻辑

又叫事件总线(或消息总线),网上关于该框架的使用说明很多很多,我也是照着网上的一些教程学会使用的,在使用的过程中,突然发现以前很想实现但没能实现的代码逻辑终于可以实现了,说代码逻辑之前还是先说下EventBus的基本使用方法吧.
1,EventBus的使用方法:
如果是Android Studio 的开发者,直接在dependence里搜索EventBus,然后添加依赖即可,网上教程有很多,Eclipse的直接下载jar包添加到项目即可.添加完毕之后,在想要接收消息的界面的onCreate()方法中使用EventBus.getDefault().register(this);来注册一个事件监听器,在onDestroy()方法中解绑这个监听器.然后再写一个方法(方法名随意),格式如下:

    @Subscribe(threadMode = ThreadMode.MainThread)
    public void ServiceCarInfo(QueryResult> result) {

    }

这个方法是用来接收EventBus发送的消息的,这里注意一下,如果想指定EventBus具体给哪个方法发送消息,或者说EventBus想让哪个方法接收它发的消息,可以通过指定方法的参数类型,并且EventBus在发送这个消息时也要使用这个类型来发送(相当于建立了一个一对一的通道),这样这个方法可以唯一的接收这个消息.
2,要优化的代码逻辑:
使用的流程说完了,下面重点说一下我要利用EventBus实现的代码逻辑:我们都知道,基本上每个应用或多或少的都需要联网获取数据,而进行http请求的时候,一般有两种方式第一种使用asyncTask(异步任务)+Android原生http请求代码,第二种方法是使用网络请求框架,显而易见,第二种方法是比较好的,因为好的框架既能提高http请求速度也能提高程序性能,比如当前比较流行的一些网络请求框架如Volley,Xutils,afinal(okhttp不算框架)等,但是这些框架都有一个通用的方式,就是请求的结果采用回调的方式返回到客户端,我们只能在这些回调方法中做一些事情,如给变量赋值,给控件设置文本等,这些回调结果都是异步返回的,也就是说,当代码执行到网络请求方法时,并不能立刻同步的得到结果,而是等请求完毕之后才会有结果返回,虽然这些框架有的也有同步的方法,但是并不好用,所以还是需要使用异步的方式获取数据,而这种方式就会导致如果我在A界面发起http请求,那么我的网络请求代码就必须得写在A界面,写过的都知道,使用框架进行http请求时,一般至少会有onSuccess回调,onFailure回调,也会有onStart回调,onLoading回调,onCancel回调,onFinish回调等.光这些回调方法就能占用将近20行,而有时一个界面会请求4,5个接口,甚至更多,那么就是将近100行的代码,而这些代码完全跟我们的业务逻辑无关,如果能把所有http请求的代码统一放在一个类里面,同样采用异步方式请求,请求完毕之后的结果也能传递到A界面,这样我们在A界面只需要专注于业务逻辑即可,这样代码看起来不仅舒服同样符合java低耦合的特点,而EventBus则恰好能做到这一点(扯了这么多,终于说出重点了).
3,具体的实现:
(1),在统一的http请求类里面,写一个方法,如下

public class HttpConnection {

    public static void getServiceCarInfo() {
        String url = "http://123.56.66.32:8082/serviceCarType/serviceCarTypeList";
        RequestParams params = new RequestParams(url);
        x.http().post(params, new Callback.CommonCallback() {
            @Override
            public void onSuccess(String json) {
                QueryResult> result = new Gson().fromJson(json, new TypeToken>>() {
                }.getType());
                EventBus.getDefault().post(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }

}

如上代码,使用 EventBus.getDefault().post(result);把服务器返回的json数据发送出去,注意发送的数据类型为QueryResult>.
(2),在A界面的button的点击事件里执行这个方法

  public void click(View view) {
        HttpConnection.getServiceCarInfo();
    }

(3),在A界面写一个接收消息的方法:

 @Subscribe(threadMode = ThreadMode.MainThread)
    public void ServiceCarInfo(QueryResult> result) {
        Log.e("tag", "result:" + result.getResult().get(0).getServiceCarTypeDesc());
    }

如上3段代码,就实现了对代码逻辑的优化,把所有的http请求方法放到统一类里,利用EventBus提供的方法,即可实现数据请求与数据解析的分离.
如果再结合ButterKnife注解框架,把所有控件,资源文件等全部以注解的方式实现,又会减少很多很多诸如findViewById,各种事件监听等与业务逻辑无关的代码,这样每个Activity或者Fragment都只专注于业务逻辑,代码看起来相当简约和清晰.
ok,说完了,EventBus使用不明白的去网上搜搜教程呗.
觉得对你有帮助就点个赞~~

你可能感兴趣的:(Android,android,EventBus框架,代码优化)