2015-11-03 42 views
1

我有一個SearchView,它執行網絡請求來搜索一些曲目,然後用結果填充RecylerView。我發現這個代碼工作正常。使用RxJava更新RecyclerView上的UI(加載和錯誤視圖)

我已經通過適配器集成了RecyclerView EmptyView,但現在我正試圖在此代碼中集成LoadingView(Progress)和ErrorView。我試着在ConcatMap裏面將可見性爲True的LoadingView(ProgressBar)放在concatMap中,但得到了錯誤:「只有創建視圖層次結構的原始線程可以觸及其視圖。」可以在MainThread上運行它,但我確信有一個更好的方法來做到這一點。

有人可以更好地瞭解在何處以及如何將顯示/隱藏ErrorView和LoadingView的邏輯集成到此代碼中?

我也在使用RxBinding。也許也使用RxRecyclerView將是一個好主意?

RxSearchView.queryTextChanges(searchView). 
      filter(charSequence -> 
        !TextUtils.isEmpty(charSequence)) 
      .throttleLast(100, TimeUnit.DAYS.MILLISECONDS) 
      .debounce(200, TimeUnit.MILLISECONDS) 
      .onBackpressureLatest() 
      .concatMap(searchTerm -> 
        { 



         return searchTracks(searchTerm). 
           .subscribeOn(Schedulers.io()) 
           .onErrorResumeNext(throwable1 -> { 
              //handle error somehow, change UI 

              return Observable.empty(); 
             } 

           ); 

        } 
      ) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(tracks -> { 


       populateTracks(tracks); 

        } 
       }); 


      }, throwable -> { 

      //show errorView 


      }); 
+0

你有機會獲得活動會在這裏?如果是這樣,['activity.runOnUiThread(..)'](http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29)是你的朋友 –

回答

8

這是我的完整解決方案,沒有爲演示文稿剝離代碼。

RxSearchView.queryTextChanges(searchView) 
    .skip(1) 
    .doOnNext(charSequence -> Log.v(TAG, "searching: " + charSequence)) 
    .throttleLast(100, TimeUnit.MILLISECONDS) 
    .debounce(200, TimeUnit.MILLISECONDS) 
    .onBackpressureLatest() 
    .observeOn(AndroidSchedulers.mainThread()) 
    .filter(charSequence -> { 
     final boolean empty = TextUtils.isEmpty(charSequence); 
     if (empty) { 
      Log.v(TAG, "empty view"); 
      mAdapter.clear(); 
     } 
     return !empty; 
    }) 
    .concatMap(charSequence -> { 
     Log.v(TAG, "requesting " + charSequence); 
     return onErrorResumeNext(
       mGitApiService.searchRepositoriesSingle(charSequence.toString()) 
         .subscribeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()), 
       throwable -> { 
        try { 
         throw throwable; 
        } catch (HttpException httpException) { 
         showEmptyErrorView(httpException.message()); 
        } catch (Throwable other) { 
         showEmptyErrorView(other.getMessage()); 
         other.printStackTrace(); 
        } 
        return Observable.empty(); 
       }); 
    }) 
    .doOnNext(charSequence -> Log.v(TAG, "got data")) 
    .subscribe(response -> { 
     showRepositories(response.getItems()); 
    }, throwable -> { 
     throwable.printStackTrace(); 
     showEmptyErrorView(throwable.getMessage()); 
    }); 

所以基本上只要你摸摸你的觀點,你必須調用.observeOn(AndroidSchedulers.mainThread())

+0

* *所以基本上每當你觸及你的視圖,你必須調用.observeOn(AndroidSchedulers.mainThread())**部分應該突出顯示,因爲這是最重要的事情。基本上,當你正在處理另一個時,你應該在同一個線程中。這種情況反彈在Computation線程中,但視圖在主線程中。 –

相關問題