Android中RxJava使用9----自定義圖片快取框架
阿新 • • 發佈:2018-12-17
操作符:concat 不交錯的發射兩個或多個Observable的發射物
原理:
圖片快取框架,原理
1)檢查圖片是否在記憶體中快取
2)如果不在,檢查圖片是否在檔案中快取
3)如果不在,則從網路上拿圖片
下面程式碼只說明原理,真正實現功能,下載原始碼
1、在build.gradle中新增依賴
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
這個依賴包中包含了
rxbinding-0.4.0 (操作控制元件)
rxjava-1.1.0 (Java相關的)
rxandroid-1.1.0 (安卓相關的)
2、MainActivity中
package com.zhh.app; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import com.orhanobut.logger.Logger; import rx.Observable; import rx.Subscriber; import rx.functions.Action1; import rx.functions.Func1; /** * concat * 不交錯的發射兩個或多個Observable的發射物 * 圖片快取框架,原理 * 1、檢查圖片是否在記憶體中快取 * 2、如果不在,檢查圖片是否在檔案中快取 * 3、如果不在,則從網路上拿圖片 * */ public class MainActivity extends Activity { private Button buton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buton = (Button) findViewById(R.id.buton); buton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 依次傳送 memoryObservable,diskObservable,netWorkObservable Observable.concat(memoryObservable, diskObservable, netWorkObservable) // 傳送第一個不為空Observable .first(new Func1<String, Boolean>() { @Override public Boolean call(String s) { return !TextUtils.isEmpty(s); } }) .subscribe(new Action1<String>() { @Override public void call(String s) { Logger.t("111").d("get data from " + s); } }); } }); } /** * 模擬記憶體中快取的圖片 */ final Observable<String> memoryObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(""); subscriber.onCompleted(); } }); /** * 模擬檔案中快取的圖片 */ final Observable<String> diskObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(""); subscriber.onCompleted(); } }); /** * 模擬網路拿到圖片 */ final Observable<String> netWorkObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("network"); subscriber.onCompleted(); } }); }
3、activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" > <Button android:id="@+id/buton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="圖片框架" /> </LinearLayout>