編輯:關於android開發
RxJava在github上的地址:https://github.com/ReactiveX/RxJava
RxAndroid在github上的地址:https://github.com/ReactiveX/RxAndroid
本文主要介紹RxAndroid的使用,如果對於RxJava還不熟悉的可以先看一下RxJava的介紹文章。
Android的程序是用Java書寫的,Android也有一些自己的線程模型,例如AsyncTask和Handler等。RxJava正是結合了前面的這幾項,在此基礎上推出了RxAndroid。下面介紹使用。
首先,我們在項目中引入RxAndroid,主要是在gradle腳本中引入下面兩句話即可。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
//引入RxAndroid----begin
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
//引入RxAndroid----end
}
這樣就可以在Android代碼中使用RxAndroid了,下面的例子展示了一段使用RxAndroid書寫的代碼:
Observable.just("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* an Observer */);
這一段代碼是在RxAndroid的官網上寫的一段示例的代碼。這裡可以看出來,與RxJava相比較,其主要增加了如下的幾個java文件:
AndroidSchedulers
BuildConfig
HandlerScheduler
MainThreadSubscription
RxAndroidPlugins
RxAndroidSchedulersHook
下面分別對這幾個文件的源碼看一下:
1.AndroidSchedulers類的源碼
public final class AndroidSchedulers {
private AndroidSchedulers() {
throw new AssertionError("No instances");
}
private static class MainThreadSchedulerHolder {
static final Scheduler MAIN_THREAD_SCHEDULER =
new HandlerScheduler(new Handler(Looper.getMainLooper()));
}
public static Scheduler mainThread() {
Scheduler scheduler =
RxAndroidPlugins.getInstance().getSchedulersHook().getMainThreadScheduler();
return scheduler != null ? scheduler : MainThreadSchedulerHolder.MAIN_THREAD_SCHEDULER;
}
}
這個類主要提供了MainThread調度器,在RxAndroid中需要在主線程中處理的食物都需要用到這個類的mainThread。
2.BuildConfig類的源碼:
public final class BuildConfig {
public static final boolean DEBUG = false;
public static final String APPLICATION_ID = "rx.android";
public static final String BUILD_TYPE = "release";
public static final String FLAVOR = "";
public static final int VERSION_CODE = -1;
public static final String VERSION_NAME = "";
}
主要是一些常量配置。
3.HandlerScheduler類的源碼:
public final class HandlerScheduler extends Scheduler {
public static HandlerScheduler from(Handler handler) { //從一個Handler中創建一個Scheduler
if (handler == null) throw new NullPointerException("handler == null");
return new HandlerScheduler(handler);
}
private final Handler handler;
HandlerScheduler(Handler handler) {
this.handler = handler;
}
@Override
public Worker createWorker() {//覆蓋Scheduler的createWorker函數,創建基於Handler的Worker
return new HandlerWorker(handler);
}
static class HandlerWorker extends Worker {
private final Handler handler;
private final CompositeSubscription compositeSubscription = new CompositeSubscription();
HandlerWorker(Handler handler) {
this.handler = handler;
}
@Override
public void unsubscribe() {
compositeSubscription.unsubscribe();
}
@Override
public boolean isUnsubscribed() {
return compositeSubscription.isUnsubscribed();
}
@Override
public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) {//覆蓋Worker的調度函數schedule
if (compositeSubscription.isUnsubscribed()) {
return Subscriptions.unsubscribed();
}
action = RxAndroidPlugins.getInstance().getSchedulersHook().onSchedule(action);
final ScheduledAction scheduledAction = new ScheduledAction(action);
scheduledAction.addParent(compositeSubscription);
compositeSubscription.add(scheduledAction);
handler.postDelayed(scheduledAction, unit.toMillis(delayTime));//使用Handler處理這個調度動作ScheduleAction
scheduledAction.add(Subscriptions.create(new Action0() {
@Override
public void call() {
handler.removeCallbacks(scheduledAction);//這句話保證當調度動作被取消的時候,能夠及時把這個action從Handler中移除
}
}));
return scheduledAction;
}
@Override
public Subscription schedule(final Action0 action) {
return schedule(action, 0, TimeUnit.MILLISECONDS);
}
}
}
HandlerScheduler 類就是使用Handler作為處理核心的Scheduler類。
4.MainThreadSubscription類的源碼:
public abstract class MainThreadSubscription implements Subscription {
public static void verifyMainThread() { //靜態方法,判斷當前線程是否是主線程
if (Looper.myLooper() != Looper.getMainLooper()) {
throw new IllegalStateException(
"Expected to be called on the main thread but was " + Thread.currentThread().getName());
}
}
private final AtomicBoolean unsubscribed = new AtomicBoolean();
@Override public final boolean isUnsubscribed() {
return unsubscribed.get();
}
@Override public final void unsubscribe() {//主線程的取消訂閱
if (unsubscribed.compareAndSet(false, true)) {
if (Looper.myLooper() == Looper.getMainLooper()) {//如果是主線程直接進行
onUnsubscribe();
} else {
AndroidSchedulers.mainThread().createWorker().schedule(new Action0() {//如果不是主線程,就創建創建一個Action放到主線程中去執行
@Override public void call() {
onUnsubscribe();
}
});
}
}
}
protected abstract void onUnsubscribe();
}
MainThreadSubscription類主要在意的就是unsubscribe的執行線程,這裡采取一切方式保證其在主線程中執行。
5.RxAndroidPlugins類的源碼:
public final class RxAndroidPlugins {//這個類的主要作用就是維護了一個RxAndroidSchedulersHook
private static final RxAndroidPlugins INSTANCE = new RxAndroidPlugins();
public static RxAndroidPlugins getInstance() {
return INSTANCE;
}
private final AtomicReference<RxAndroidSchedulersHook> schedulersHook =
new AtomicReference<RxAndroidSchedulersHook>();
RxAndroidPlugins() {
}
@Beta
public void reset() {
schedulersHook.set(null);
}
public RxAndroidSchedulersHook getSchedulersHook() {
if (schedulersHook.get() == null) {
schedulersHook.compareAndSet(null, RxAndroidSchedulersHook.getDefaultInstance());//如果原來是null,就設置一個RxAndroidSchedulersHook
// We don't return from here but call get() again in case of thread-race so the winner will
// always get returned.
}
return schedulersHook.get();
}
public void registerSchedulersHook(RxAndroidSchedulersHook impl) {
if (!schedulersHook.compareAndSet(null, impl)) {//如果原來的RxAndroidSchedulerHook是空,則直接持有,否則拋出異常
throw new IllegalStateException(
"Another strategy was already registered: " + schedulersHook.get());
}
}
}
可以看出RxAndroidSchedulerHook必須在使用前注冊,一旦使用就不能再注冊了。
6.RxAndroidSchedulersHook類的源碼:
public class RxAndroidSchedulersHook {
private static final RxAndroidSchedulersHook DEFAULT_INSTANCE = new RxAndroidSchedulersHook();
public static RxAndroidSchedulersHook getDefaultInstance() {
return DEFAULT_INSTANCE;
}
public Scheduler getMainThreadScheduler() {
return null;
}
public Action0 onSchedule(Action0 action) {
return action;
}
}
這是RxAndroid提供的一個默認的RxAndroidSchedulerHook類,程序員也可以自己定義一個這樣的類注冊到RxAndroidPlugins中,但是必須在使用RxAndroidPlugins之前注冊。
自定義的RxAndroidSchedulerHook類可以覆蓋onSchedule函數,在這裡進行一些處理,例如日志記錄等。
以上只是說明了RxAndroid與RxJava中不一樣的地方,並沒有嘗試說明RxJava是什麼,在閱讀本文之前,讀者應該先弄明白這個問題。
現在再來看之前的兩個例子就很明白了:
public class ReactiveFragment extends Fragment {//在UI線程中的例子
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Observable.just("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* an Observer */);
}
new Thread(new Runnable() {//在其他線程中的例子
@Override
public void run() {
final Handler handler = new Handler(); //綁定到這個線程的Handler
Observable.just("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(HandlerScheduler.from(handler))
.subscribe(/* an Observer */)
// perform work, ...
}
}, "custom-thread-1").start();
第 1 章 前言,前言
第 1 章 前言,前言1.什麼是3G 3G,全稱為3rd Generation,中文含義就是指第三代數字通信。 所謂3G,是指將無線通信與國際互聯網等多媒體通信結合的新一
關於數據抓取之xpath提取text為空問題的原因和解決方案
關於數據抓取之xpath提取text為空問題的原因和解決方案今天在抓取淘寶網網頁的時候,使用了:#店名 shopname = driver.find_element_by
Android數據存儲的三種方式介紹(SharedPrefrences,File,SQLite)
Android數據存儲的三種方式介紹(SharedPrefrences,File,SQLite) 1,使用SharedPrefrences 用於簡單少量的數據,數據的
Android 購物車功能的實現,android購物車實現
Android 購物車功能的實現,android購物車實現首先,眾所周知,ListView是Android最常用的控件,可以說是最簡單的控件,也可以說是最復雜的控件。 作
關於jni編譯32位、64位動態庫(Android.mk和Application.mk文件),jniapplication.mk
關於jni編譯32位、64位動態庫(Android.mk和Applica