標籤:error: editable 解決 view 任務 scheduler 看到了 處理 put
Rxandroid
作為一個在設計模式中能把MVP發揮的淋漓盡致的架構不去學習感覺真的對不起自己,然後也學點新東西吧,響應式編程,MVP觀察者模式,然後使用RxAndroid使我們自己的代碼更加簡潔
然後昨天看了一個文章說,介面調用頻繁使用的話會使你的整個代碼看起來非常難以理解,其實想想也是,一個讀者看到了你的代碼,然後卻發現你的代碼裡充斥著介面回調,哎,這時候
他就需要尋找你這個介面到底回調到了哪裡(想想也是這個道理啊);
所以Rx(Android、java)系列很好解決了這個問題,我也是昨天才意識到,因為你可以把所需要執行的任務和任務產生的回調放在同一個地方,然後這個時候,就不需要找來找去了吧
一目瞭然,任務(耗時任務或者不耗時任務)執行地,任務傳回值以及後續的處理都以鏈式的形式調用;
MVP是啥
即Model view Presenter,
mvp模式可以分離顯示層和邏輯層,他們之間通過介面進行通訊(好像我之前很多都是用介面通訊的誒!冥冥中也有用到mvp模式),降低耦合;
可以看出Presenter分別和Model和view互動,而view和Model之間並沒有直接聯絡
這樣隨著我們的業務在拓展然後UI改變的話,或者商務邏輯改變UI也有修改的話,如果不分開,那將是一件非常頭疼的事,因為你都要兩者兼顧,但是現在你只需要
專心專註於UI介面或者商務邏輯的修改了!嗯 ,差不多MVP就是這個好處吧
然後是RxAndroid
rxandroid是rxjava的擴充,然後使用起來的話有提供很多方法給我們進行任務的操作
如just,map,fromCallable等。然後是兩個重要的類Observable(事件發行者,被觀察者),Observer(觀察者,事件訂閱者,Subscription(事件訂閱者)。
just方法使用
just方法適用於不耗時的任務,同步方法
//事件發行者 Observable<String> listObservable;/**just測試,這裡的getString是一個簡單的返回String的函數(不貼出來)*/ listObservable = Observable.just(getString());listObservable.subscribe(new Observer<String>() { @Override public void onCompleted() { Log.v("test","OnCompleted"); } @Override public void onError(Throwable e) { Log.v("test","OnError"+e); } @Override public void onNext(String s) { textView.setText(s); Log.v("test","OnNext:------"+s); } });
如上代碼just()方法參數內可以傳入一個值,值的類型由事件發行者在定義時規定,應與其保持一致。值擷取成功後將通知onNext函數“發布”。
然後我們就可以在onNext函數進行相關操作了。這是簡單的使用,然而rxandroid精髓之處在於對線程的操作(雖然我會說,但是感覺還是沒有完全理解)
fromCallable()方法
just方法只是一個基礎的方法,然而在實際情況中我們會有很多耗時的操作比如,網路請求,比如資料庫儲存等等,這個時候我們就需要用到非同步方法
fromcallbale用法和just類似,但是多了些控制線程的東西
/**長時間耗時任務測試*/ listObservable = Observable.fromCallable(new Callable<String>() { @Override public String call() throws Exception { return getStringLongTime(); } });Subscription mtvSubscription = listObservable .subscribeOn(Schedulers.io()) //指定Observable中的方法啟動並執行線程 .observeOn(AndroidSchedulers.mainThread())//指定onNext運行線程 .subscribe(new Observer<String>() { @Override public void onCompleted() { Log.v("test_CallAble","OnCompled:------"); } @Override public void onError(Throwable e) { Log.v("test_CallAble","OnError:------"+e); } @Override public void onNext(String s) { textView.setText(s); Log.v("test_CallAble","OnNext:------"+s); } });
被觀察者new了一個Callable的執行個體,裡面運行長時間耗時任務,完成後將非同步通知觀察者的OnNext方法
subscribOn是指定Observable啟動並執行線程
observeOn是指定觀察者OnNext方法所執行的線程
map方法
這裡copy一下大神的代碼過來,表述了map的使用方法,自行領會 debounce設定延遲時間
mTextWatchSubscription = mSearchResultsSubject .debounce(400, TimeUnit.MILLISECONDS)//設定400毫秒等待時間 .observeOn(Schedulers.io()) .map(new Func1<String, List<String>>() { @Override public List<String> call(String s) { return mRestClient.searchForCity(s); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<String>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<String> cities) { handleSearchResults(cities); } });mSearchInput.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //有text改變時,調用onNext方法 mSearchResultsSubject.onNext(s.toString()); } @Override public void afterTextChanged(Editable s) { } });
圖片引用自:Android 源碼 設計模式 解析與實戰 【何紅輝,關愛民著】
部分代碼copy自部落格園還沒好好感受年輕
RxAndroid/java小記