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'}
阅读全文
0 0
- RxJava2.0初步使用
- RxJava2初步使用
- RxJava2.0使用(一)
- RxJava2.0使用(二)
- RxJava2.0使用(三)
- RxJava2.0使用
- RxJava2.0的使用
- RxJava2.0+Retrofit使用
- RxJava2.0的使用-1
- RxJava2.0的使用-2
- RxJava2.0的使用-3
- rxjava2.0使用教程(二)
- RxJava2.0的使用详解
- RxJava2.0的使用代码
- RxJava2.0的使用详解
- Rxjava2.0使用笔记一
- RxJava2.0的使用详解
- Rxjava2使用
- 习题一
- linux驱动 -helloworld
- 补档计划
- 深入Serializable
- 新建spring boot提示UnknownHostException: start.spring.io
- RxJava2.0初步使用
- JAVA JSON解析:类XPATH解析JSON
- 求最大公约数
- 44、我的C#学习笔记10
- setsockopt用法详解
- 文章标题
- 习题3.2
- 获取单选框被选中的值
- AS多渠道打包和代码混淆