1. 程式人生 > >Android中RxJava使用9----自定義圖片快取框架

Android中RxJava使用9----自定義圖片快取框架

操作符: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>