⑴ android studio 怎麼添加rxjava的jar包
將第三方jar包加入到libs文件夾中,打開工程所在Project Structure,然後選擇Dependencies,點擊那個加號選擇File Dependency ,然後再Libs文件夾中選擇要導入的jar包。
兩外還有一種方法是在project選中jar包點擊右鍵"Add as library",這種方法需要定位到項目的根目錄,即build.gradle所在的目錄。
dependencies
{
compile files('libs/android-support-v4.jar')
compile files('libs/xxxx.jar')
}
⑵ retrofit2+MVP+rxjava2+rxlifecycle2 為什麼無法解決內存泄露
隨著Android第三庫的普及, RxJava 和 RxAndroid ( tiveX/RxAndroid )越來越被人熟知,簡潔的語法,配合Java8 Lambda表達式,使代碼的結構更加清晰,通過線程調度器更容易控制和切換線程,種種優點,使用它的人也越來越多。但是使用不好,很容易導致內存泄露。 Rxlifecycle (b.com/trello/RxLifecycle )就使被用來嚴格控制由於發布了一個訂閱後,由於沒有及時取消,導致Activity/Fragment無法銷毀導致的內存泄露 。
RxJava和RxAndroid
compile 'io.reactivex:rxandroid:1.0.1'compile 'io.reactivex:rxjava:1.0.16'12
Rxlifecycle
compile 'com.trello:rxlifecycle:0.3.0'
compile 'com.trello:rxlifecycle-components:0.3.0'12
Rxlifecycle 使用
Activity/Fragment需繼承RxAppCompatActivity/RxFragment,目前支持的有RxAppCompatActivity、RxFragment、RxDialogFragment、RxFragmentActivity。
一、bindToLifecycle()方法
在子類使用Observable中的compose操作符,調用,完成Observable發布的事件和當前的組件綁定,實現生命周期同步。從而實現當前組件生命周期結束時,自動取消對Observable訂閱。
Observable.interval(1, TimeUnit.SECONDS)
.compose(this.bindToLifecycle())
.subscribe(new Action1<Long>() {
@Override
public void call(Long num) {
Log.i(TAG, " " +num);
}
});12345678
二、bindUntilEvent() 方法
使用ActivityEvent類,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分別對應生命周期內的方法。使用bindUntilEvent指定在哪個生命周期方法調用時取消訂閱。
Observable.interval(1, TimeUnit.SECONDS) .compose(this.bindUntilEvent(ActivityEvent.PAUSE))
.subscribe(mSub);
⑶ Android studio安裝好後這里的API只有一種是什麼原因呢
dependencies {
implementation 'io.reactivex.rxjava2:rxjava:2.2.0-SNAPSHOT'
}
我們在BaseLibrary中可以正常使用rxjava。
這時我們的UserCenter中添加了
dependencies {
implementation project(':BaseLibrary')
}
⑷ io.reactivex.rxjava2是android下哪個包引用的
你下載的文件比較奇怪,也許是下載軟體重命名錯誤,下載下來的文件應該是一個zip壓縮包,解壓出來放到手機卡上就行了。試試.bmap擴展名改成.zip能不能解壓。 到78App網站查看回答詳情>>
⑸ android 用rxjava和retrofit時怎麼解決返回數據類型不一致
1. 首先定義帶泛型的返回結果,Retrofit API 的原生結果映射為這種形式:
class Result<T> {
String ResultMessage;
int ResultCode;
T Data;
}
2. 處理錯誤的方法和 @朱詩雄 前輩方法差不多,放到作為靜態方法放到 RetroUtil 里,這里 ApiException 為自己定義的一個異常,放入錯誤碼和錯誤信息(錯誤碼不止一個):
static <T> Observable<T> flatResult(Result<T> result) {
return Observable.create(subscriber -> {
switch (result.ResultCode) {
case Constants.SUCCESS_CODE:
subscriber.onNext(result.Data);
break;
case Constants.ERROR_CODE:
subscriber.onError(new ApiException(result.ResultCode, result.ResultMessage);
break;
default:
// ...
}
subscriber.onCompleted();
}
});
}
3. 在 API 包裝類對於上述 Result<T> 格式的返回結果,統一調用 flatMap(RetroUtil::flatResult) 後的 API。這樣每個 API 的返回結果就是 Observable<Data> 的形式並且在 errorHandler 中統一處理錯誤了。
// 介面方法
Observable<Result<User>> getUserInfo();
// 包裝後的方法
Observable<User> getUserInfo() {
return mApi.getUserInfo.flatMap(RetroUtil::flatResult);
}
// 調用時
apiWrapper.getUserInfo()
.subscrible(user -> {
// 處理正常邏輯
}, error -> {
// 處理錯誤邏輯和異常,這里封裝時通常也會統一處理,
// 提供一個默認的 Action1<Throwable> 參數,彈出
// throwable 的 message 列印日誌等
});
⑹ retrofit 2 支持rxjava2了嗎
,一、 簡介 Retrofit是Square公司開發的一款針對Android網路請求的框架,Retrofit2底層基於OkHttp實現的,OkHttp現在已經得到Google官方認可,大量的app都採用OkHttp做網路請求,其源碼詳見OkHttp Github。 本文全部是在Retrofit2.0+版本基礎上論...
⑺ 安卓開發什麼工具能讓rxjava方法縮進
RxJava 好在哪
換句話說,『同樣是做非同步,為什麼人們用它,而不用現成的 AsyncTask / Handler / XXX / ... ?』
一個詞:簡潔。
非同步操作很關鍵的一點是程序的簡潔性,因為在調度過程比較復雜的情況下,非同步代碼經常會既難寫也難被讀懂。 Android 創造的AsyncTask 和Handler ,其實都是為了讓非同步代碼更加簡潔。RxJava 的優勢也是簡潔,但它的簡潔的與眾不同之處在於,隨著程序邏輯變得越來越復雜,它依然能夠保持簡潔。
假設有這樣一個需求:界面上有一個自定義的視圖 imageCollectorView ,它的作用是顯示多張圖片,並能使用 addImage(Bitmap) 方法來任意增加顯示的圖片。現在需要程序將一個給出的目錄數組 File[] folders 中每個目錄下的 png 圖片都載入出來並顯示在imageCollectorView 中。需要注意的是,由於讀取圖片的這一過程較為耗時,需要放在後台執行,而圖片的顯示則必須在 UI 線程執行。常用的實現方式有多種,我這里貼出其中一種:
new Thread() {
@Override
public void run() {
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();
而如果使用 RxJava ,實現方式是這樣的:
Observable.from(folders)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schelers.io())
.observeOn(AndroidSchelers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});
那位說話了:『你這代碼明明變多了啊!簡潔個毛啊!』大兄弟你消消氣,我說的是邏輯的簡潔,不是單純的代碼量少(邏輯簡潔才是提升讀寫代碼速度的必殺技對不?)。觀察一下你會發現, RxJava 的這個實現,是一條從上到下的鏈式調用,沒有任何嵌套,這在邏輯的簡潔性上是具有優勢的。當需求變得復雜時,這種優勢將更加明顯(試想如果還要求只選取前 10 張圖片,常規方式要怎麼辦?如果有更多這樣那樣的要求呢?再試想,在這一大堆需求實現完兩個月之後需要改功能,當你翻回這里看到自己當初寫下的那一片迷之縮進,你能保證自己將迅速看懂,而不是對著代碼重新捋一遍思路?)。
另外,如果你的 IDE 是 Android Studio ,其實每次打開某個 Java 文件的時候,你會看到被自動 Lambda 化的預覽,這將讓你更加清晰地看到程序邏輯:
Observable.from(folders)
.flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
.filter((Func1) (file) -> { file.getName().endsWith(".png") })
.map((Func1) (file) -> { getBitmapFromFile(file) })
.subscribeOn(Schelers.io())
.observeOn(AndroidSchelers.mainThread())
.subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) });
如果你習慣使用 Retrolambda ,你也可以直接把代碼寫成上面這種簡潔的形式。而如果你看到這里還不知道什麼是 Retrolambda ,我不建議你現在就去學習它。原因有兩點:1. Lambda 是把雙刃劍,它讓你的代碼簡潔的同時,降低了代碼的可讀性,因此同時學習 RxJava 和 Retrolambda 可能會讓你忽略 RxJava 的一些技術細節;2. Retrolambda 是 Java 6/7 對 Lambda 表達式的非官方兼容方案,它的向後兼容性和穩定性是無法保障的,因此對於企業項目,使用 Retrolambda 是有風險的。所以,與很多 RxJava 的推廣者不同,我並不推薦在學習 RxJava 的同時一起學習 Retrolambda。事實上,我個人雖然很欣賞 Retrolambda,但我從來不用它。