2016-01-27 32 views
6

Mã của tôi là như thế này:Rxjava AndroidSchedulers.mainThread() có nghĩa là chuỗi giao diện người dùng?

.observeOn(AndroidSchedulers.mainThread()) 
.subscribeOn(AndroidSchedulers.mainThread()) 
.subscribe ({ 
    adapter.notifyDataSetChanged() 
}) 

nhưng tôi đã nhận một lỗi: Chỉ thread ban đầu mà tạo phân cấp hình ảnh có thể chạm vào quan điểm của mình. vì vậy tôi thay đổi nó thành:

.observeOn(AndroidSchedulers.mainThread()) 
.subscribeOn(AndroidSchedulers.mainThread()) 
.subscribe ({ 
     runOnUiThread(Runnable { 
      adapter.notifyDataSetChanged() 
}) 
} 

Nó làm cho sense.So Tôi bối rối. Tôi đã nghĩ rằng .observeOn(AndroidSchedulers.mainThread()) có nghĩa là mã trong khối đăng ký chạy trên chuỗi ui, nhưng làm cách nào tôi nhận được lỗi này?

+0

Stacktrace có trỏ đến 'adapter.notifyDataSetChanged()'? Mb lỗi là trong một phần khác của chuỗi? Nói chung, có, 'mainThread()' có nghĩa là chuỗi giao diện người dùng của Android. – AndroidEx

+0

Tôi không biết làm thế nào để tìm ra liệu stacktrace điểm để adapter.notifyDataSetChanged –

Trả lời

6

Vấn đề là với mã ở đây:

.observeOn(AndroidSchedulers.mainThread()) 
.subscribeOn(AndroidSchedulers.mainThread()) 

Bạn không thể đăng ký trên thread UI như bạn để ý, bạn sẽ nhận được một ngoại lệ:

Only the original thread that created a view hierarchy can touch its views.

gì bạn cần làm là để đăng ký chuỗi I/O và quan sát trên chuỗi giao diện người dùng:

.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe() 
+0

Cảm ơn bạn. Tại sao Observable không thể đăng ký trên chuỗi giao diện người dùng? –

Các vấn đề liên quan