一、EventBus:应用程序内各组件间、组件与后台线程间的通信。EventBus的核心在于:主线程发送消息、线程之间的通信,各组件传输数据,异步操作(开启子线程处理耗时任务),发送粘性事件等操作。
具体操作步骤:
1、需要在项目build.gradle里添加依赖 compile 'org.greenrobot:eventbus:3.0.0' 2、接收数据的类需要在onCreate里注册和在onDestroy里取消注册(注册后才能获得数据类(信息类)) 3、自定义数据类 4、发送类通过EventBus.getDefault().post(new 自定义类)发送数据 5、接收类自定一个接收方法,参数需要为自定义类,还需要在上方添加线程类型@Subscribe(threadMode =ThreadMode.MAIN) 线程类型: POSTING(默认):表示事件处理函数的线程跟发布事件的线程在同一个线程。 MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。 BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。 ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
//注册
EventBus.getDefault().register( this );
//取消注册
EventBus.getDefault().unregister( this );
//自定义数据类
public class MyData {
String name;
int age;
String address;
public MyData(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
//接收方法
@Subscribe(threadMode = ThreadMode.MAIN) //threadMode为线程类型
public void receiver(MyData data){ //3.0版本后方法名可以自取
//接收到数据后对数据类的操作,具体逻辑
String name;
int age;
String address;
name=data.getName();
age=data.getAge();
address=data.getAddress();
textView.setText( name+"\n"+age+address );
}
//发送数据
EventBus.getDefault().post(new MyData("张三",20,"\n地球"));
二、Butterknife:注解作用,根据布局控件id生成相应的后台代码,可省略findViewById(),setOnClickListener(),ListView的点击@OnItemClick, CheckBox的@OnCheckedChanged也可以实现省略操作
具体操作步骤:
1、File->Settings->Plugins->butterknife Zelezny添加插件(添加过就不用再添加了) 2、使用前需要在app下的build.gradle的dependencies下添加: compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' 3、选中setContentView(R.layout.activity_main)这一行的布局文件activity_main:按快捷键 alt+insert,选中相应的控件和事件,生成后台代码
可以一次指定多个id,为多个View绑定一个事件处理方法:
//也可分离(spilt)处理@OnClick(R.id.button),在生成代码时选中spilt按钮即可
@OnClick({R.id.button, R.id.checkBox, R.id.content})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button:
break;
case R.id.checkBox:
break;
case R.id.content:
break;
}
}