RxJava2.0初步使用

来源:互联网 发布:农村淘宝合伙人不干了 编辑:程序博客网 时间:2024/05/29 09:30

RXJava2.0的基本原理理解:

  • 整体理解

基于之前其他文章中的说法,把Observable看成是整个业务的上游,把Observer看成是整个业务的下游,上游与下游之间通过subscribe的方式完成连通,也就是订阅关系,也即

observable.subscribe(observer);

将Observable和Observer的创建串起来写,即称为所谓的链式操作

Observable.create(new ObservableOnSubscribe<Bitmap>() {//初始化Observable            @Override            public void subscribe(@NonNull ObservableEmitter<Bitmap> e) throws Exception {                for (int i=0;i<8;i++) {                    String img_url= StringUtil.IMG_URL+(i+1)+".jpg";                    e.onNext(httpGetImage(img_url));                }                e.onComplete();            }        }).subscribeOn(Schedulers.io())//Schedulers实现线程管理                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<Bitmap>() {//初始化Observer            @Override            public void onSubscribe(@NonNull Disposable d) {            }            @Override            public void onNext(@NonNull Bitmap bmp) {                mList.add(bmp);                myAdapter.notifyDataSetChanged();            }            @Override            public void onError(@NonNull Throwable e) {                Toast.makeText(MainActivity.this,"图片获取异常...",Toast.LENGTH_SHORT).show();            }            @Override            public void onComplete() {                Toast.makeText(MainActivity.this,"图片加载成功...",Toast.LENGTH_SHORT).show();            }        });
  • 方法说明

    • Schedulers调度器实现异步

    之前说的同步实现异步的说法感觉有问题,RxJava其实是通过调度器去实现异步的,所以即使你将成串的网络请求写在Observable的subscribe订阅方法里而不用Schedulers调度器,那么网络请求操作依然是执行在新建Observable对象的那个线程,换言之,将会导致线程阻塞;现在使用调度器Schedulers,在subscribeOn方法里传入Schedulers.io()表示订阅操作发生在io读写线程,相当于创建了一个子线程,去实现网络请求耗时操作;observeOn里传入(AndroidSchedulers.mainThread()表示观察者观察这一系列操作发生在android的主线程,这样就很简单地实现了异步。

    • ObservableOnSubscribe实现事件发送

    泛型T表示发送的内容,也即最终观察者Observer的OnNext方法里接收到的数据类型

    • 事件发送规则:
1.上游可以发送无限个onNext, 下游也可以接收无限个onNext.2.当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.3.当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.4.上游可以不发送onComplete或onError.5.最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然

响应式编程实践的一个实例

简述:完成一系列网络图片加载到ListView上

MainActivity.java:

package com.example.nc039.imageload;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;import controller.MyAdapter;import io.reactivex.Observable;import io.reactivex.ObservableEmitter;import io.reactivex.ObservableOnSubscribe;import io.reactivex.Observer;import io.reactivex.Scheduler;import io.reactivex.android.schedulers.AndroidSchedulers;import io.reactivex.annotations.NonNull;import io.reactivex.disposables.Disposable;import io.reactivex.schedulers.Schedulers;import utils.StringUtil;public class MainActivity extends AppCompatActivity  {@BindView(R.id.lv_showImg)ListView lvShowImage;MyAdapter myAdapter;List<Bitmap> mList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        getImageResource();        initView();    }    private void getImageResource() {        Observable.create(new ObservableOnSubscribe<Bitmap>() {//初始化Observable            @Override            public void subscribe(@NonNull ObservableEmitter<Bitmap> e) throws Exception {                for (int i=0;i<8;i++) {                    String img_url= StringUtil.IMG_URL+(i+1)+".jpg";                    e.onNext(httpGetImage(img_url));                }                e.onComplete();            }        }).subscribeOn(Schedulers.io())//Schedulers实现线程管理                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<Bitmap>() {//初始化Observer            @Override            public void onSubscribe(@NonNull Disposable d) {            }            @Override            public void onNext(@NonNull Bitmap bmp) {                mList.add(bmp);                myAdapter.notifyDataSetChanged();            }            @Override            public void onError(@NonNull Throwable e) {                Toast.makeText(MainActivity.this,"图片获取异常...",Toast.LENGTH_SHORT).show();            }            @Override            public void onComplete() {                Toast.makeText(MainActivity.this,"图片加载成功...",Toast.LENGTH_SHORT).show();            }        });    }    private void initView() {        mList=new ArrayList<>();        myAdapter=new MyAdapter(this,mList);        lvShowImage.setAdapter(myAdapter);    }    public Bitmap InputStream2Bitmap(InputStream is) {        return BitmapFactory.decodeStream(is);    }    public Bitmap httpGetImage(String imgUrl){        HttpURLConnection connection = null;        try {            URL url = new URL(imgUrl);            connection = (HttpURLConnection) url.openConnection();            connection.setConnectTimeout(3000);            connection.setRequestMethod("GET");            connection.setDoInput(true);            connection.setRequestProperty("Charset", "UTF-8");            if (connection.getResponseCode() == 200) {                InputStream is = connection.getInputStream();               return InputStream2Bitmap(is);            }        } catch (IOException ex) {            ex.printStackTrace();        } finally {            if (connection != null) {                connection.disconnect();            }        }        return null;    }}

MyAdapter.java:

package controller;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import com.example.nc039.imageload.R;import java.util.ArrayList;import java.util.List;/** * Created by NC039 on 2017/10/31. */public class MyAdapter extends BaseAdapter{    List<Bitmap> mList=new ArrayList<>();    Activity act;    @Override    public int getCount() {        return mList.size();    }    @Override    public Object getItem(int i) {        return null;    }    @Override    public long getItemId(int i) {        return 0;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        ViewHolder holder;        if(null==view){            holder=new ViewHolder();            view= LayoutInflater.from(act).inflate(R.layout.list_item,null);            holder.mImage=(ImageView)view.findViewById(R.id.list_image);            holder.mBtn=(Button)view.findViewById(R.id.list_btn);            view.setTag(holder);        }else{            holder=(ViewHolder)view.getTag();        }        holder.mImage.setImageBitmap(mList.get(i));        holder.mBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {            }        });        return view;    }    public MyAdapter(Activity act,List<Bitmap> mList){        this.mList=mList;        this.act=act;    }    class ViewHolder {        public ImageView mImage;        public Button mBtn;    }}

资源在我搭建的服务器上:

StringUtil.java:

package utils;/** * Created by NC039 on 2017/10/31. */public class StringUtil {    public static final String IMG_URL="http://192.168.80.110:8080/test/";}

build.gradle:

apply plugin: 'com.android.application'android {    compileSdkVersion 25    buildToolsVersion "25.0.3"    defaultConfig {        applicationId "com.example.nc039.imageload"        minSdkVersion 19        targetSdkVersion 25        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile 'com.android.support:appcompat-v7:25.3.1'    testCompile 'junit:junit:4.12'    compile 'com.jakewharton:butterknife:8.5.1'    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'    // Because RxAndroid releases are few and far between, it is recommended you also    // explicitly depend on RxJava's latest version for bug fixes and new features.    compile 'io.reactivex.rxjava2:rxjava:2.1.0'}
原创粉丝点击