2015-11-03 61 views
1

我有以下代碼,可以很好地在列表視圖中顯示結果。問題在於打字時電話會阻止鍵盤,但是當我嘗試在io線程上訂閱時,它不起作用。我的問題是:在哪裏調用我的休息界面的正確位置?需要RXJava異步幫助。通過調用阻止輸入

o1 = RxTextView.textChangeEvents(etSearch).throttleLast(500, TimeUnit.MILLISECONDS) 
      .map(new Func1<RxTextViewTextChangeEvent, String>() { 
        @Override 
        public String call(RxTextViewTextChangeEvent rxTextViewTextChangeEvent) { 
         return etSearch.getText().toString(); 
        } 
       } 
      ); 
    o1.observeOn(RxAndroidSchedulers.mainThread()).filter(new Func1<String, Boolean>() { 
     @Override 
     public Boolean call(String s) { 
      return s.length() > 2; 
     } 
    }).subscribe(new Action1<String>() { 
     @Override 
     public void call(String s) { 

       List<CrewMember> crewMemberList = rest.getCrewMemberList(s); 
       ListView crewFinderResultsListView = (ListView) findViewById(R.id.list); 
       crewMemberAdapter = new CrewFinderResultRowAdapter(mContext, getLayoutInflater()); 
       crewMemberAdapter.setCrewMemberList(crewMemberList); 
       crewFinderResultsListView.setAdapter(crewMemberAdapter); 

     } 
    }); 

回答

1

我的猜測是,rest.getCrewMemberList(s)是網絡電話或保存回主線程,否則那種阻塞調用。如果第一個,你可能在主線程異常中獲得了一個網絡,因爲你不使用帶有錯誤回調的重載的subscribe重載。您必須將呼叫轉移到io()計劃程序:

RxTextView.textChangeEvents(etSearch) 
    .throttleLast(500, SECONDS) 
    .filter(s -> s.length() > 2) 
    .switchMap(s -> 
     Observable.fromCallable(() -> rest.getCrewMemberList(s)) 
     .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(crewMembersList -> { 
     ListView crewFinderResultsListView = (ListView) findViewById(R.id.list); 
      crewMemberAdapter = new CrewFinderResultRowAdapter(
       mContext, getLayoutInflater()); 
      crewMemberAdapter.setCrewMemberList(crewMemberList); 
      crewFinderResultsListView.setAdapter(crewMemberAdapter); 
    }, 
    e -> Log.d(...)); 
+0

仍然試圖讓我的工作,但我明白你的建議,似乎是要走的路。謝謝你的幫助! –