2017-03-05 2 views
0

現在、RxJava 2(2.0.6)を使用してapi呼び出しを遅延させようとしています。 ビューレイヤ(アクティビティ)にCalledFromWrongThreadExceptionをスローします。RxJava 2によりCalledFromWrongThreadExceptionがスローされる

Process: com.timmccarthy.litt, PID: 22060 
                    io.reactivex.exceptions.UndeliverableException: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
                     at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366) 
                     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:62) 
                     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:51) 
                     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) 
                     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) 
                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                     at java.lang.Thread.run(Thread.java:818) 
                    Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
                     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8128) 
                     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1220) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.view.View.requestLayout(View.java:20085) 
                     at android.support.v7.widget.RecyclerView.requestLayout(RecyclerView.java:3576) 
                     at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:4620) 
                     at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:10448) 
                     at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:6105) 
                     at com.timmccarthy.litt.ui.ticket.TicketActivity.showTickets(TicketActivity.java:82) 
                     at com.timmccarthy.litt.ui.ticket.TicketPresenter$1.onNext(TicketPresenter.java:46) 
                     at com.timmccarthy.litt.ui.ticket.TicketPresenter$1.onNext(TicketPresenter.java:37) 
                     at io.reactivex.observers.SerializedObserver.onNext(SerializedObserver.java:111) 
                     at io.reactivex.internal.operators.observable.ObservableDelay$DelayObserver$1.run(ObservableDelay.java:84) 
                     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:59) 
                     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:51)  
                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
                     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)  
                     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)  
                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
                     at java.lang.Thread.run(Thread.java:818)  

基本的に私は:ここでは

はここにここに私の活動の私の見解方法

@Override 
public void showTickets(final ArrayList<Ticket> tickets) { 


//  runOnUiThread(new Runnable() { 
//   @Override 
//   public void run() { 
    if (recyclerView.getAdapter() == null){ 
     adapter = new TicketAdapter(tickets); 
     recyclerView.setAdapter(adapter); 
    } else { 
     adapter.setTickets(tickets); 
     adapter.notifyDataSetChanged(); 
    } 
    recyclerView.setHasFixedSize(true); 
//   } 
//  }); 

} 

@Override 
public void refreshLoadComplete() { 
//  runOnUiThread(new Runnable() { 
//   @Override 
//   public void run() { 
    swipeRefreshLayout.setRefreshing(false); 
    Toast.makeText(TicketActivity.this, "Completed", Toast.LENGTH_SHORT).show(); 
//   } 
//  }); 
} 

@Override 
public void refreshLoadStart() { 
//  runOnUiThread(new Runnable() { 
//   @Override 
//   public void run() { 
    swipeRefreshLayout.setRefreshing(true); 
//   } 
//  }); 
} 

は例外のスタックトレースです

view.refreshLoadStart(); 
    Observable.just(createTicketArray(10)) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .delay(5, TimeUnit.SECONDS) 
      .subscribe(new Observer<ArrayList<Ticket>>() { 
       @Override 
       public void onSubscribe(Disposable d) { 

       } 

       @Override 
       public void onNext(ArrayList<Ticket> tickets) { 
        if (getView() != null){ 
         view.showTickets(tickets); 
        } 
       } 

       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
        if (getView() != null){ 
         view.refreshLoadComplete(); 
        } 
       } 

       @Override 
       public void onComplete() { 
        if (getView() != null){ 
         view.refreshLoadComplete(); 
        } 
       } 
      }); 

私のプレゼンターの私の観察可能ですObservableでメインスレッドで観測しているので、なぜこのExceptionがスローされているのか尋ねています。別のスレッドではありませんか?

p.s私はコード内のコメントアウトされたセクションの修正を見つけましたが、これは簡単な修正と見なされていますが、なぜ例外が表示されるのかは実際には説明されていません。

答えて

0

実際には、メインスレッド以外のビューを変更しています。このsubscribeOn(Schedulers.newThread())を試してください。

この行は実行されますか? Toast.makeText(TicketActivity.this, "Completed", Toast.LENGTH_SHORT).show();コメントアウトされたセクションは、あなたがすでにメインスレッド上にあるため動作しません。

+0

これを試しただけで、以前と同じ例外がスローされます。 コメントアウトされたセクションは機能します。なぜなら、あなたがメインのUIスレッドにない場合、メインのUIスレッドのコードを実行し、メインのUIスレッド上にあれば、通常通り。 –

0

どこが間違っているのか分かりません。

私の 'swipetorefresh'リスナーは、別の観測可能なプレゼンターのリフレッシュメソッドを呼び出していました。

この2番目の問題を解決し、すべての問題が解消されました。

関連する問題