RxAndroid入門例項(結合OkHttp)
阿新 • • 發佈:2019-01-10
思考從網路請求資料的非同步任務,通常使用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賦值等操作。首先活動的負擔大大減少,其次非同步執行緒也很好控制。