事件总线 Otto框架官网地址:http://square.github.io/otto/
一、介绍
Otto是一个事件总线设计中分离出的应用程序的不同部分,同时仍然允许他们有效的沟通。它增加了独特的功能,已经细分事件总线,以及它专门为Android平台。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、用法
(2.1) Eclipse直接下载jar架包(http://square.github.io/otto/);
(2.2) Android Studio中在Build.grade中添加如下:
dependencies {
compile 'com.squareup:otto:1.3.8' //Otto事件总线 http://square.github.io/otto/
}
proguard-project.txt
file中添加如下
-keepattributes *Annotation* -keepclassmembers class ** { @com.squareup.otto.Subscribe public *; @com.squareup.otto.Produce public *; }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、代码部分
/** *创建AppBus */ public class AppBus extends Bus { private static AppBus bus; public static AppBus getInstance(){ if (bus == null){ bus = new AppBus(); } return bus; } }
/** *普通的Java Bean */ public class BusEventData { private String content; public BusEventData(String content) { this.content = content; } // Command+N Getter and Setter public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
package com.carzone.ottodemo; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.View; import android.widget.Button; /** * 应用场景:通过Activity修改Fragment里面的数据,或者通过Fragment修改Activity里的数据 * */ public class MainActivity extends Activity { private Button btn1,btn2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findviews(); init(); addListener(); } private void findviews() { btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); } private void init() { FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.fragment_layout,TestFragment.getInstance()); transaction.commit(); } private void addListener() { btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AppBus.getInstance().post(new BusEventData("niu menglin")); } }); btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AppBus.getInstance().post("hello"); } }); } @Override protected void onResume() { super.onResume(); // AppBus.getInstance().register(this); } @Override protected void onPause() { super.onPause(); // AppBus.getInstance().unregister(this); } }
package com.carzone.ottodemo; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import com.squareup.otto.Subscribe; /** * Created by niumenglin on 16/8/16. */ public class TestFragment extends Fragment { private EditText et; private View view; public static TestFragment getInstance() { TestFragment testFragment = new TestFragment(); return testFragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // return super.onCreateView(inflater, container, savedInstanceState); view = inflater.inflate(R.layout.fragment_test, container, false); findviews(); return view; } private void findviews() { et = (EditText) view.findViewById(R.id.et); } @Override public void onStart() { super.onStart(); //1.注册到bus事件总线中 AppBus.getInstance().register(this); } @Override public void onStop() { super.onStop(); //2.取消注册 AppBus.getInstance().unregister(this); } /** * [定义订阅者],Activity中发布的消息,在此处会接收到, * 在此之前需要先在程序中register,看上面的onStart和onStop函数 * @param data * * 方法用@Subscribe注解标志,表示此方法可以接收到数据的变化,对应的参数是BusEventData类型 */ @Subscribe public void setContent(BusEventData data) { et.setText(data.getContent()); } /** * 方法用@Subscribe注解标志,表示此方法可以接收到数据的变化,对应的参数是String类型 * @param data */ @Subscribe public void setCon(String data) { et.setText(data); } @Subscribe public void onDataChange(String sss) { System.out.println("====" + sss); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Button 1" /> <Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Button 2" /> <LinearLayout android:id="@+id/fragment_layout" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_marginTop="10dp" android:layout_weight="1" android:orientation="horizontal" /> </LinearLayout>
fragment_test.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- option + command +L 格式化--> <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>