/** * 演示RxJava的介紹以及基本使用 * * 1.RxJava是什麼? * RxJava本質就是一個實現異步操作的庫 異步 * * 2.RxJava優點 簡潔(隨着程序的邏輯變得複雜 可以將複雜的邏輯代碼串成一條線) * * 3.原理 RxJava異步實現 拓展的觀察者模式 * * 觀察者模式:A對象(觀察者)對B(被觀察者)對象的某種變化比較敏感 需要在B對象變化的瞬間 * 作出反應 程序中的觀察者模式 採用註冊或者訂閱方式 告訴被觀察者當他變化是通知觀察者 * * android應用中的觀察者案例 view視圖綁定單擊事件 * view被觀察者---onClickListener單擊事件的監聽器 觀察者 * 註冊/訂閱 setOnClickListener() * 當單擊view視圖時 通知onClickListener單擊事件的監聽器觀察者對象作出響應(回調onClick方法) * * RxJava中觀察者模式 * RxJava中四個基本概念 Observable(被觀察者) Observer(觀察者) * Subscribe(訂閱/註冊) * Observable(被觀察者) Observer(觀察者)通過Subscriber()方法實現訂閱關係 * Observable需要時發出事件通知Observer * */
以下是它的幾種基本的用法:
通過分別創建觀察者,創建被觀察者,註冊被觀察者分別使用,也可以將其全部一條線寫下:
1,最基本的用法:(使用分解的方式,)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.創建Observer觀察者對象 他主要決定事件觸發時有怎麼樣的行爲
Observer<String> observer=new Observer<String>() {
/**
* 事件隊列操作完畢時回調的寒肅
* rxjava中事件處理時不僅可以單獨處理還可以看作事件隊列
*
* 作爲事件結束的標誌
*/
@Override
public void onCompleted() {
Log.i("tag","------onCompleted------");
}
/**
* 事件處理過程中出現異常的時候回調
* onError()被觸發 整個的事件的處理中止
* 注意:onCompleted()和onError()互斥 正常的事件處理過程中只會調用其中一個函數
*/
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
/**
* 類似與view中 OnClickListener中的onClick方法
* 主要對被觀察者觸發的事件處理的方法
*/
@Override
public void onNext(String s) {
Log.i("tag","-------onNext-----"+s);
}
};
//2.創建被觀察者對象 他決定什麼時候觸發事件以及觸發怎麼樣的事件
/*
Observable.create() RxJava中創建事件序列的方法
create()方法中需要傳入OnSubscribe對象 OnSubscribe存儲到Observable對象中(計劃表)
當Observable被訂閱時 OnSubscribe接口中的call()會被回調 事件的序列纔會依次執行觸發
*/
Observable observable=Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("hi");
subscriber.onNext("how are you");
subscriber.onCompleted();
}
});
//3. 訂閱 註冊 view.setOnClicklistener(onClickListener)
observable.subscribe(observer);
}
}
2,使用觀察者子類的方法:public class MainActivity02 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* RxJava中有一個具體實現Observer抽象類的類 Subscriber
* Subscriber是Observer觀察者類的具體子類 對Observer觀察者進行了拓展
* 如果只是使用基本功能 Subscriber、Observer基本一樣
* 區別:
* 1.Subscriber類中增加了onStart()方法
* 2.unSubscribe()取消訂閱 當該方法被調用後 Subscriber將不再接收事件
*/
Subscriber<String> subscriber=new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("tag","------onCompleted------");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(String s) {
Log.i("tag","-------onNext-----"+s);
}
/**
* Subscriber中添加的方法 表示在事件發送之前被調用 準備工作 數據清零重置操作
*/
@Override
public void onStart() {
super.onStart();
}
};
//2.創建被觀察者對象 他決定什麼時候觸發事件以及觸發怎麼樣的事件
// Observable observable=Observable.create(new Observable.OnSubscribe<String>() {
// @Override
// public void call(Subscriber<? super String> subscriber) {
// subscriber.onNext("Hello");
// subscriber.onNext("hi");
// subscriber.onNext("how are you");
// subscriber.onCompleted();
// }
// });
//just() 將傳入的參數作爲onNext()方法的參數進行使用,這個地方just()代替了.create();
// Observable observable=Observable.just("Hello","Hi","how are you");
String[] array={"Hello","Hi","how are you"};
Observable observable=Observable.from(array);
//3. 訂閱 註冊 view.setOnClicklistener(onClickListener)
// observable.subscribe(observer);
observable.subscribe(subscriber);
}
}
3,他通過拆分觀察者的使用:(將觀察者的三種方法全部分別封裝起來使用)
public class ActionActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* Action0是RxJava中的接口 具有一個方法call() 該方法無參數 無返回值
* Observer觀察者類中onCompleted()也是無參數無返回值 Action0當作
* 一個包裝對象 將onCompleted()的內容打包作爲參數進行提供給subscribe()
* 進行使用 不完整定義的回調
*/
Action0 completed=new Action0() {
@Override
public void call() {
Log.i("tag","--------onComplted----");
}
};
/**
* Action1 也是一個接口 具有一個call(T t) 該方法具有一個參數無返回值
* 對onNext()方法的封裝作爲不完整定義的回調
有一點一定要注意,這裏的call其實就相當與前邊的那三個方法其中的每一個,分別裝了起來,每一個都叫做call;
*/
Action1<String> nextAction=new Action1<String>() {
@Override
public void call(String s) {
Log.i("tag","-------onNext----"+s);
}
};
Action1<Throwable> errorAction=new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
};
Observable observable=Observable.just("Hello","Hi");
observable.subscribe(nextAction,errorAction,completed);
}
}
下面演示一種整體的步驟:(三種就不全部寫了,只寫一種了,意思都差不多)public class TestActivity extends AppCompatActivity{
//1.打印字符串數組中的內容
private String[] array={"sd","fg","hj","io","pl"};
private ImageView iv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv= (ImageView) findViewById(R.id.iv_show);
// Observable.from(array).subscribe(new Action1<String>() {
// @Override
// public void call(String s) {
// Log.i("tag","----------"+s);
// }
// });
//2.根據圖片的資源id 將圖片設置到ImageView控件中
Observable.create(new Observable.OnSubscribe<Drawable>() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void call(Subscriber<? super Drawable> subscriber) {
//將圖片的資源id轉換成drawable
Drawable drawable=getTheme().getDrawable(R.mipmap.cat);
subscriber.onNext(drawable);
subscriber.onCompleted();
}
}).subscribe(new Observer<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
iv.setImageDrawable(drawable);
}
});
}
}
說道Rxjava就會使用到
Scheduler 調度器 下面說一下調度器的使用:
/**
* RxJava出現就是爲了實現異步操作 後臺處理[工作線程處理耗時操作] 前臺調用[UI線程調用顯示]
* Scheduler 調度器 線程的控制器 RxJava中通過該對象指定每一段代碼運行在哪個線程中
* RxJava中內置的調度器
* Schedulers.immediate() 默認scheduler 直接在當前線程中執行
* Schedulers.newThread() 表示啓動新的線程 並且代碼在新線程中執行操作
* Schedulers.io() io操作線程(讀寫文件 讀寫數據庫 網絡信息交互等)
* io()與newThread()行爲模式類似 區別:io()內部無數量上限的線程池
* 比newThread()更高效
* Schedulers.computation() 複雜的計算使用調度器
*
* RxAndroid中專門的AndroidSchedulers.mainThread()將操作放到android的主線程/ui線程中執行
*/
public class SchedulerActivity extends AppCompatActivity{
private ImageView iv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv= (ImageView) findViewById(R.id.iv_show);
Observable.create(new Observable.OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable=getResources().getDrawable(R.mipmap.cat);
subscriber.onNext(drawable);
subscriber.onCompleted();
}
}) /**
subscribeOn()指定事件發生的線程 就是Observable.OnSubscribe被調用時所處的線程
表示Observable被觀察者對象中的call方法執行的線程
*/
.subscribeOn(Schedulers.io())
/**
* observeOn() 表示Observer觀察者運行的線程 事件的消費線程
*/
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
iv.setImageDrawable(drawable);
}
});
}
}
如何在內部將某種類型轉換成另一種類型並輸出:
map()可以進行事件轉換
/**
* 演示 RxJava中對事件的轉換
* 事件轉換:將事件序列中對象或者是整個事件序列進行加工處理 轉換成不同的事件序列
*/
public class MapActivity extends AppCompatActivity {
private ImageView imageView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.iv_show);
//圖片的路徑(字符串)--bitmap圖片的對象進行展示
final String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + "dog.jpg";
Observable.just(filePath)
/**
* map()對事件轉換的方法 參數Func1
* Func1也是RxJava中的接口 與Action1類似 用於包裝具有一個參數的函數
*
* Func1和Action1的區別
* Func1 包裝具有返回值的方法
* Action1 包裝無返回值的方法
*
* Func1<需要轉換的事件的類型,轉換後的結果類型>
* Func1底層對create()方法的封裝 將String字符串轉換成bitmap封裝到
* Observable被觀察者對象中
*/
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
return BitmapFactory.decodeFile(s);
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
});
}
}
//那麼如何對整個事件進行轉換;
/**
* 演示RxJava中對整個事件序列的轉換
*/
public class FlatMapActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// //1.需求:現有一個學生類 需要打印學生的姓名
// Student student01=new Student(1,"張三");
// Student student02=new Student(2,"李斯");
// Student[] students={student01,student02};
//
// Observable.from(students)
// .map(new Func1<Student, String>() {
// @Override
// public String call(Student student) {
// return student.getName();
// }
// })
// .subscribe(new Observer<String>() {
// @Override
// public void onCompleted() {
//
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onNext(String s) {
// Log.i("tag","--學生姓名--"+s);
// }
// });
//2.需求:Student類中加入需要學習的課程名稱 區別:每個學生只有一個名字 但是可以學習多門課程
List<Course> list01=new ArrayList<>();
list01.add(new Course(1,"語文"));
list01.add(new Course(2,"數學"));
final Student stu01=new Student(1,"張三",list01);
List<Course> list02=new ArrayList<>();
list02.add(new Course(1,"Android"));
list02.add(new Course(2,"Java"));
Student stu02=new Student(2,"李斯",list02);
Student[] stus={stu01,stu02};
// Observable.from(stus).subscribe(new Observer<Student>() {
// @Override
// public void onCompleted() {
//
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onNext(Student student) {
// List<Course> courses=student.getCourses();
// for(int i=0;i<courses.size();i++){
// Course c=courses.get(i);
// Log.i("tag",c.getCourseName());
// }
// }
// });
/**
* flatMap()和map()共同點 都是對傳入的參數轉換返回另一個對象
* 不同點:flatMap()轉換後返回是Observable對象
*/
Observable.from(stus)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
})
.subscribe(new Observer<Course>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Course course) {
Log.i("tag","----course-----"+course.getCourseName());
}
});
}
}