1、在Android Studio中添加RxJava2
一、在build.Gradle添加:
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
compile ‘io.reactivex.rxjava2:rxjava:2.1.2’
二、点synet,
三、添加完成。
java
2、简单使用RxJava2
一、设定一个场景。
有一个快餐店(kuaicandian)。
我(wo)订了(subscribe)一份快餐,并留下了地址。
等待送餐到家。react
二、写代码。android
//建立一个快餐店。Observable(被观察者) Observable<String> kuaicandian=Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { Thread.sleep(6000); e.onNext("快餐(牛肉面)");//发送数据 e.onComplete();//关闭发送数据,之后不能再使用e.onNext } });
//建立一个我(wo)。Observer(观察者) Observer<String> wo=new Observer<String>() { @Override public void onSubscribe(Disposable d) { tv.setText(tv.getText()+"RxJava-开始送快餐"+"\n"); } @Override public void onNext(String s) { tv.setText(tv.getText()+"RxJava-快餐送达:"+s+"\n"); } @Override public void onError(Throwable e) { tv.setText(tv.getText()+"RxJava-送快餐出错"+"\n"); } @Override public void onComplete() { tv.setText(tv.getText()+"RxJava-本次快餐送达完毕"+"\n"); } };
//把你的地址留给快餐店。subscribe(订阅) observable.subscribe(wo);
三、点击”按键1“,界面冻结(正在作牛肉面),过一会,运行结果出现
由没有出错,因此只有三行信息。app
四、解决界面冻结问题,(本文重点)。
界面冻结是由于在主线程使用了 Thread.sleep(6000),在解决问题只需将这一块放到另外一个线程中便可。在rxjava中很是简单,在代码中添加红色部分:ide
//把你的地址留给快餐店。subscribe(订阅)
kuaicandian.subscribeOn(Schedulers.newThread())
.subscribe(wo);ui
subscribeOn是把快餐店转到另外一个线程,Schedulers.newThread()是新建子一个线程放置快餐店。
运行代码,此次点”按键1”后,界面没有再被冻结,点其余“按键”,文本框中的内容也会改变,可是6秒钟后,快餐店信息有时能够送到有时送不到,什么缘由呢?spa
subscribeOn把快餐店转到了另外一个线程,快餐店送餐时就要跨线程到把快餐信息送到主线程来,但跨了线程是不可传数据 的,因此要把快餐店再转为主线程。线程
//把你的地址留给快餐店。subscribe(订阅)
kuaicandian.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.subscribe(wo);3d
observeOn是把子线程转到主线程,AndroidSchedulers.mainThread()是 android的main这个主线程。
再次运行代码,和上图同样,但这一次其余按键均可以点击。
code
五、所有代码以下:
界面代码:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.ls30_rxjava2_1.MainActivity"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" android:orientation="horizontal"> <Button android:id="@+id/bt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按键1" android:onClick="bt1_onClick" /> <Button android:id="@+id/bt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按键2" android:onClick="bt2_onClick"/> <Button android:id="@+id/bt3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按键3" android:onClick="bt3_onClick"/> <Button android:id="@+id/bt4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按键4" android:onClick="bt4_onClick"/> </LinearLayout> </RelativeLayout>java代码
public class MainActivity extends AppCompatActivity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv=(TextView) findViewById(R.id.tv); } public void bt1_onClick(View view) { tv.setText(""); //建立一个快餐店。Observable(被观察者) Observable<String> kuaicandian=Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { Thread.sleep(6000); e.onNext("快餐(牛肉面)"); e.onComplete(); } }); Observer<String> wo=new Observer<String>() { @Override public void onSubscribe(Disposable d) { tv.setText(tv.getText()+"RxJava-开始送快餐"+"\n"); } @Override public void onNext(String s) { tv.setText(tv.getText()+"RxJava-快餐送达:"+s+"\n"); } @Override public void onError(Throwable e) { tv.setText(tv.getText()+"RxJava-送快餐出错"+"\n"); } @Override public void onComplete() { tv.setText(tv.getText()+"RxJava-本次快餐送达完毕"+"\n"); } }; //把你的地址留给快餐店。subscribe(订阅) kuaicandian.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(wo); } public void bt3_onClick(View view) { tv.setText("点了按键3"); } public void bt2_onClick(View view) { tv.setText("点了按键2"); } public void bt4_onClick(View view) { tv.setText("点了按键4"); } }