編輯:關於android開發
Rx是響應式編程的意思, 本質是觀察者模式, 是以觀察者(Observer)和訂閱者(Subscriber)為基礎的異步響應方式. 在Android編程時, 經常會使用後台線程, 那麼就可以使用這種方式. 目前的異步編程方式都會導致一些問題, 如
(1) Asynctasks can easily lead to memory leaks.
(2) CursorLoaders with a ContentProvider require a large amount of configuration and boilerplate code to setup.
(3) Services are intended for longer running background tasks and not fast-finishing operations, such as making a network call or loading content from a database.
RxAndroid來源於RxJava, 在RxJava的基礎上擴展了一些Android的功能, 已經發布1.0版本, 讓我們來看看怎麼用吧.
新建一個HelloWorld程序. 配置build.gradle
, 添加RxAndroid庫和Lamada表達式支持, 還有ButterKnife.
plugins {
id me.tatarka.retrolambda version 3.2.2
}
...
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
...
compile 'com.jakewharton:butterknife:7.0.1'
compile 'io.reactivex:rxandroid:1.0.1'
}
Lambda表達式支持不是必須的, 可以讓你代碼更加簡潔, 減少匿名類的出現.
頁面很簡單, 設置三個按鈕, 觸發耗時的線程操作, 分別用主線程, Asynctasks
, Rx方式調用, 觀察ProcessBar的狀態.
添加一個阻塞任務, 執行5秒, 成功反饋.
// 長時間運行的任務
private String longRunningOperation() {
try {
Thread.sleep(5000);
} catch (Exception e) {
Log.e(DEBUG, e.toString());
}
return Complete!;
}
主線程執行時, 會導致UI卡頓
// 線程運行
mThreadButton.setOnClickListener(v -> {
mThreadButton.setEnabled(false);
longRunningOperation();
Snackbar.make(mRootView, longRunningOperation(), Snackbar.LENGTH_LONG).show();
mThreadButton.setEnabled(true);
});
異步線程執行
// 異步線程
private class MyAsyncTasks extends AsyncTask {
@Override
protected void onPostExecute(String s) {
Snackbar.make(mRootView, s, Snackbar.LENGTH_LONG).show();
mAsyncButton.setEnabled(true);
}
@Override
protected String doInBackground(Void... params) {
return longRunningOperation();
}
}
// 異步運行
mAsyncButton.setOnClickListener(v -> {
mAsyncButton.setEnabled(false);
new MyAsyncTasks().execute();
});
響應式方式執行, 使用IO線程處理, 主線程響應, 也可以使用其他線程處理, 如Schedulers.io()
處理IO的線程, Schedulers.computation()
計算的線程, Schedulers.newThread()
新創建的線程.
// 使用IO線程處理, 主線程響應
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber subscriber) {
subscriber.onNext(longRunningOperation());
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
// 響應式運行
mRxButton.setOnClickListener(v -> {
mRxButton.setEnabled(false);
observable.subscribe(new Subscriber() {
@Override
public void onCompleted() {
mRxButton.setEnabled(true);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Snackbar.make(mRootView, s, Snackbar.LENGTH_LONG).show();
}
});
});
使用響應式編程可以更好的處理內存洩露問題, 代碼也更加優雅和可讀, 選擇執行線程和監聽線程也更加方便. 在destroy時, 可以關閉正在執行的異步任務. 還有一些其他優勢, 就參考網站吧.
Android系統的五種數據存儲形式(一),android數據存儲 Android系統有五種數據存儲形式,分別
我們在智能手機上應該都見過可以滑動操作的圖片集,在Android開發中我們是用
android:ListView緩存機制及BaseAdapter的三重境界(逗比式,普通式,文藝式) 大家都知道listview的格式是一定的 而數據源確是多重多樣的
(轉)最強Android模擬器genymotion的安裝與配置,androidgenymotion Android開發人員都知道,原生的模擬器啟動比較慢,操作起來也不流暢