2015-11-03 59 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

仍然试图让我的工作,但我明白你的建议,似乎是要走的路。谢谢你的帮助! –