1. 程式人生 > >RxAndroid入門例項(結合OkHttp)

RxAndroid入門例項(結合OkHttp)

思考從網路請求資料的非同步任務,通常使用AsyncTask或其他方式將非同步任務與當前活動繫結在一起。這樣做有很多風險,活動的負擔太重,執行緒也不能及時的關閉。或者把非同步任務封裝在工具類裡,利用介面回撥得到資料,但是這樣也不是很好。下面看看rx怎麼實現從網上下載一張圖片並賦值給UI:

別忘了新增網路許可權

1.首先建立一個工具類並寫一個方法,返回值為一個觀察者,泛型是想要的資料(位元組陣列):

public class DownLoadUtil {
    private OkHttpClient client;

    public DownLoadUtil(){
        client=new OkHttpClient();
    }

    public Observable<byte []> download(String path){
        return Observable.create(new Observable.OnSubscribe<byte[]>() {
            @Override
            public void call(Subscriber<? super byte[]> subscriber) {
                if (!subscriber.isUnsubscribed()){
                    //在這裡訪問網路併發送資料
                    Request request=new Request.Builder().url(path).build();
                    client.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                        }
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful()){
                                subscriber.onNext(response.body().bytes());
                                subscriber.onCompleted();
                            }
                        }
                    });
                }
            }
        });
    }
}

使用OkHttp進行網路請求,拿到位元組陣列後呼叫觀察者的onNext進行傳送。

2.在活動中建立這個被觀察者並訂閱自定義的觀察者,在onNext中處理資料:

DownLoadUtil util=new DownLoadUtil();
                util.download(path).observeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<byte[]>() {
                            @Override
                            public void onCompleted() {
                            }
                            @Override
                            public void onError(Throwable e) {
                            }
                            @Override
                            public void onNext(byte[] bytes) {
                                Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                                iv.setImageBitmap(bitmap);
                            }
                        });

被觀察者呼叫的兩個observeOn第一個是指任務在網路請求中執行涉及io,第二個表示任務在主執行緒執行。我的這段程式碼是寫在一個點選事件中,雖然涉及UI操作,但是因為指定在主執行緒執行所以沒有任何問題。

可以看到整個結構非常清晰,非同步網路任務在被觀察者中進行,拿到資料後傳送給觀察者,觀察者進行UI賦值等操作。首先活動的負擔大大減少,其次非同步執行緒也很好控制。