android中RXJava的基本使用

本文介绍了RxJava的基本使用方法,包括观察者模式的应用、线程控制等,并通过一个加载网络图片的例子展示了RxJava如何简化异步任务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整个Demo学习下RXJava。
直接上代码。
在gradle中添加依赖:

    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'

不控制线程

package acxingyun.cetcs.com.rxjava;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;

public class RXJavaActivity extends Activity {

    private static final String tag = "RXJavaActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxjava);

        //创建观察者
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.i("onCompleted ---> ", "完成");
            }

            @Override
            public void onError(Throwable e) {
                Log.i("onError ---> ", e.toString());
            }

            @Override
            public void onNext(String s) {
                Log.i("onNext ---> ", "Item: " + s);
            }
        };

        //创建被观察者
        Observable observable = Observable.create(new Observable.OnSubscribe<String>(){
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello");
                subscriber.onNext("world");
                subscriber.onNext("byebye");
                subscriber.onCompleted();
            }
        });

        //被观察者注册观察者,类似Button.setOnClickListener(new View.OnClickListener());
        observable.subscribe(observer);
    }
}

运行结果:
这里写图片描述
事件在主线程发生。

进行线程控制

用线程处理耗时操作。
下面使用Glide从网络取一张图片展示在imageview中。
在gradle中添加依赖:

    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'
    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'com.android.support:support-v4:26.+'

在manifest中添加网络权限:

    <uses-permission android:name="android.permission.INTERNET" />

按键点击响应:

bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadImage();
            }
        });

加载图片

private void loadImage(){

        //创建被观察者
        Observable observable = Observable.create(new Observable.OnSubscribe<Bitmap>(){
            @Override
            public void call(Subscriber<? super Bitmap> subscriber) {
                Log.i(" call ---> ", "运行在 " + Thread.currentThread().getName() + " 线程");
                //增加网络延时
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Bitmap bitmap = null;
                try {
                    //用Glide将url转换成Bitmap
                    bitmap = Glide.with(RXJavaActivity.this).load(urlString).asBitmap().into(500, 500).get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                //将bitmap传回给观察者
                subscriber.onNext(bitmap);
                subscriber.onCompleted();
            }
        //控制被观察者的事件在io线程执行
        }).subscribeOn(Schedulers.io())
                //控制观察者在主线程获取观察结果
                .observeOn(AndroidSchedulers.mainThread());

        //创建观察者
        Observer observer = new Observer<Bitmap>() {
            @Override
            public void onCompleted() {
                Log.i(" onCompleted ---> ", "运行在 " + Thread.currentThread().getName() + " 线程");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Bitmap bitmap) {
                //处理被观察者传来的bitmap对象
                iv1.setImageBitmap(bitmap);
                Log.i(" onNext ---> ", "运行在 " + Thread.currentThread().getName() + " 线程");
            }
        };

        //绑定观察者和被观察者,即订阅
        observable.subscribe(observer);
    }

Logcat结果:
这里写图片描述
call就是被观察者调用的,我盟控制它在线程中;onNext和onComplete是观察者调用的,被控制在主线程。

附上运行效果:
这里写图片描述

平时看下网上对RXJava的介绍看得头晕,自己跑个Demo就清楚了,就是个异步消息传递的过程,我的Demo中是分别创建了观察者和被观察者,再通过订阅绑定两者关系;用的熟练之后,可以直接使用链式调用完成全部代码:

Observable.create(new Observable.OnSubscribe<Bitmap>(){

            @Override
            public void call(Subscriber<? super Bitmap> subscriber) {

            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<Bitmap>(){

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Bitmap bitmap) {

            }
        });

时间有限,今天先熟悉基本用法,以后再进一步深入,我还要改bug~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值