Android的EventBus和butterknife基本使用
使用AndroidEventBus和butterknife能够提高项目的解耦性和执行性能,是比较常用的工具。
1、Android 的EventBus基本使用
配置环境:
1、在module的配置文件加入:compile ‘org.greenrobot:eventbus:3.0.0’ 同步即可使用eventbus。
2、或者到https://github.com/greenrobot/EventBus下载工程,导入文件夹里的EventBus进工程,在
配置文件中加入:compile project(‘:EventBus’) 再同步一下即可。
使用步骤:
(1)在接收的activity中订阅事件:EventBus.getDefault().register(this);
(2)定义实体event:
package com.example.eventbustest;
public class eventBean {
private String message;
private String id;
eventBean(String message,String id)
{
this.message = message;
this.id = id;
}
public void setId(String id) {
this.id = id;
}
public void setMessage(String message) {
this.message = message;
}
public String getId() {
return id;
}
public String getMessage() {
return message;
}
}
(3)写事件发布处理函数:这里暂时以POSTING这种执行方式为例,后面讲解4种执行方式。
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventPostThread(eventBean event)
{
Log.e("tag",event.getMessage()+" onEventPostThread run in : "+Thread.currentThread().getName());
Toast.makeText(MainActivity.this,"get: "+ event.getMessage(),Toast.LENGTH_LONG).show();
}
(4)发布事件: EventBus.getDefault().post(new eventBean(“hello”,”id”));
以上是EventBus的使用常见基本步骤。下面以例子说明:
效果如下:
点击第二个activity的按钮发布事件到第一个activity中,toast出接收的信息。
下面是主函数(第一个activity)的程序:
package com.example.eventbustest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 订阅事件
* */
EventBus.getDefault().register(this);
Button button = (Button) findViewById(R.id.mbtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,testActivity.class);
startActivity(intent);
}
});
}
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventPostThread(eventBean event)
{
Log.e("tag",event.getMessage()+" onEventPostThread run in : "+Thread.currentThread().getName());
Toast.makeText(MainActivity.this,"get: "+ event.getMessage(),Toast.LENGTH_LONG).show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMain(eventBean event)
{
Log.e("tag",event.getMessage()+"onEventMain run in : "+Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBackground(eventBean event)
{
Log.e("tag",event.getMessage()+"onEventBackground run in : "+Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventAsyc(eventBean event)
{
Log.e("tag",event.getMessage()+"onEventAsyc run in : "+Thread.currentThread().getName());
}
@Override
protected void onDestroy() {
super.onDestroy();
/*
* 注销
* */
EventBus.getDefault().unregister(this);
}
}
下面是第二个activity程序:
package com.example.eventbustest;
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Log;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
/**
* 在这个activity中发送消息
*/
public class testActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eventbus);
findViewById(R.id.sbtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("tag","onclick run in : "+Thread.currentThread().getName());
//发送信息
EventBus.getDefault().post(new eventBean("hello","id"));
finish();
}
});
}
}
程序比较简单,这里重点讲解一下关于接收处理发布事件的函数执行模式:
Android 3.0 以前使用onEvent、onEventMainThread 、onEventBackgroundThread 、onEventAsync 这四个函数来处理接收事件。在Android 3.0以后开始使用注解模式来接收处理发布事件,处理的函数名可以随意命名,注解可以注明处理事件执行的模式:PostThread(默认)、MainThread、BackgroundThread与Async。下面是这些模式的使用说明
/*Android 3.0的处理模式:
* 在onEventMainThread中接收消息
* 接收函数还有以下接收事件的函数
* 1、onEvent 发布事件和接收事件线程在同一个线程,不能实现耗时动作
* 2、onEventMainThread UI线程中执行,不能实现耗时动作
* 3、onEventBackgroundThread 若事件从UI中发布则在子线程执行,否则在同意线程执行。
* 4、onEventAsync 在子线程执行
*注:对于使用同一个函数来接收的不同事件,系统自动根据接收参数来判断使用哪个函数。
* /
/ * Android3.0以后,事件订阅处理使用注解方式,可以任意命名处理函数名,使用处理
* 模式有PostThread(默认)、MainThread、BackgroundThread与Async
* PostThread在不指定处理方式情况下默认使用,该模式为发布事件和接收事件在同一个线程
* MainThread事件在UI线程执行
* BackgroundThread若事件从UI中发布则在子线程执行,否则在同意线程执行。
* Async事件在子线程中执行
* */
关于几种模式运行的例子,可参照上面的主函数里面方式验证,即打印出几个处理函数执行的线程名,效果如下:
关于eventbus的性能和详细介绍,可参考原版:http://greenrobot.org/eventbus/,这里只给出了eventbus的基本使用。
2、butterknife的基本使用:
环境配置:在File–>project structure—>dependecies—>library dependency搜索butterknife导入即可,也可通过项目方式导入等。
使用:使用比较简单,现在使用的activity中绑定ButterKnife.bind(this);
接着使用butterknife才能生效,例如想加载view资源,可通过
@BindView(R.id.mbtn)Button mb;这样就可以使用此按钮,
通过 @OnClick(R.id.sbtn)监听事件 ,@OnLongClick(R.id.sbtn)监听长按事件,@OnItemClick(R.id.sbtn)监听listview的点击事件,还可在listadapter中的viewhowe通过bindview寻找view控件使用。
又如监听多个按钮:
@OnClick({R.id.title_location_iv, R.id.title_settings_ib})
public void onClick(View view) {
switch (view.getId()) {
case R.id.title_location_iv:
break;
case R.id.title_settings_ib:
break;
}
}
关于butterknife的使用比较简单,就是代替了findViewById等,使得效率提高,节藕性提高,更加易于阅读。
贴上例子:
http://download.csdn.net/detail/tang_vincent/9886290