前言
刚更新完公司的项目,然后今天准备写一写EventBus这个东西。然后从一个小的实例中来体现EventBus的方便。
名言
把脸一直向着阳光,这样就不会见到阴影。
EventBus简介
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
实例介绍
用户注册后直接把用户名和密码显示在登录的界面上。
效果图
首先我们要用EventBus我们先要将其导入,我们在项目的gradle里面
compile ‘org.greenrobot:eventbus:3.0.0’
然后我们看看2个界面的布局
MainActivity的布局activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.beiduo.testmyeventbus.MainActivity">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:hint="账号" />
<EditText
android:id="@+id/psd"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:hint="密码" />
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:text="登录" />
<Button
android:id="@+id/reigst"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:text="注册" />
</LinearLayout>
TwoActivity的布局 activity_two.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_margin="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:hint="账号" />
<EditText
android:id="@+id/psd"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:hint="密码" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="25dp"
android:text="确定" />
</LinearLayout>
然后我们先把具体的逻辑写出来
MainActivity上面就是从MainActivity跳转到TwoActivity上。
public class MainActivity extends AppCompatActivity {
private EditText name, psd = null;
private Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setView();
}
public void initView() {
name = (EditText) findViewById(R.id.name);
psd = (EditText) findViewById(R.id.psd);
button = (Button) findViewById(R.id.reigst);
}
public void setView() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TwoActivity.class);
startActivity(intent);
}
});
}
}
先定义一个事件的类型吧
这个意思就是里面放了一个密码和用户名。
public class LoginEvent {
private String name = null;
private String password = null;
public LoginEvent(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后接下来MainActivity我们需要注册一个订阅者
EventBus.getDefault().register(this);
在MainActivity里面当Acitivity销毁的时候我们需要取消订阅
EventBus.getDefault().unregister(this);
在MainActivity里面我们需要接受一个回来的事件
@Subscribe
public void onEventMainThread(LoginEvent event) {
String nameStr = event.getName();
String psdStr = event.getPassword();
if (!nameStr.equals("") && !psdStr.equals("")) {
name.setText(nameStr);
psd.setText(psdStr);
} else {
Toast.makeText(this, "错误参数!", Toast.LENGTH_SHORT).show();
}
}
所以我们MainActivity最终的代码就是
public class MainActivity extends AppCompatActivity {
private EditText name, psd = null;
private Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册一个订阅者
EventBus.getDefault().register(this);
setContentView(R.layout.activity_main);
initView();
setView();
}
public void initView() {
name = (EditText) findViewById(R.id.name);
psd = (EditText) findViewById(R.id.psd);
button = (Button) findViewById(R.id.reigst);
}
public void setView() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转到注册上面
Intent intent = new Intent(MainActivity.this, TwoActivity.class);
startActivity(intent);
}
});
}
@Subscribe
public void onEventMainThread(LoginEvent event) {
String nameStr = event.getName();
String psdStr = event.getPassword();
if (!nameStr.equals("") && !psdStr.equals("")) {
name.setText(nameStr);
psd.setText(psdStr);
} else {
Toast.makeText(this, "错误参数!", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//activity销毁的时候取消订阅
EventBus.getDefault().unregister(this);
}
}
然后看看我们的第二个TwoActivity
public class TwoActivity extends AppCompatActivity {
private EditText name, psd = null;
private Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
initView();
setView();
}
public void initView() {
name = (EditText) findViewById(R.id.name);
psd = (EditText) findViewById(R.id.psd);
button = (Button) findViewById(R.id.button);
}
public void setView() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nameStr = name.getText().toString();
String pasStr = psd.getText().toString();
if (!nameStr.equals("") && !pasStr.equals("")) {
//发送消息
EventBus.getDefault().post(new LoginEvent(nameStr, pasStr));
finish();
} else {
Toast.makeText(TwoActivity.this, "输入内容不能为空的", Toast.LENGTH_SHORT).show();
}
}
});
}
}
通过这句话来发送消息
EventBus.getDefault().post(new LoginEvent(nameStr, pasStr));
这里就结束了是不是很简单呢?快试一试吧。希望有不对的地方指出。