CẬP NHẬT - 2016
Giải pháp thay thế tốt nhất là sử dụng RxAndroid
(các ràng buộc cụ thể cho RxJava
) cho P
trong MVP
phụ trách để có fo dữ liệu.
Bắt đầu bằng cách trở về Observable
từ phương thức hiện tại của bạn.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Sử dụng cái này có thể quan sát như thế này -
getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
@Override
public void onCompleted() {
// Print Toast on completion
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PojoObject pojoObject) {
// Show Progress
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Tôi biết tôi đến hơi muộn nhưng ở đây đi. Android về cơ bản hoạt động trên hai loại luồng là luồng UI và luồng nền . Theo tài liệu android -
Không truy cập bộ công cụ UI Android từ bên ngoài luồng UI để khắc phục sự cố này, Android cung cấp một số cách để truy cập luồng UI từ các luồng khác. Dưới đây là danh sách các phương pháp có thể giúp:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Bây giờ có nhiều phương pháp khác nhau để giải quyết vấn đề này.
Tôi sẽ giải thích nó bằng mẫu mã:
chạyOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new Runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
CUỘC SỐNG
Lớp được sử dụng để chạy một vòng lặp thông báo cho một chủ đề. Chủ đề theo mặc định không có một vòng lặp thông báo liên quan đến chúng; để tạo một cái, hãy gọi Chuẩn bị () trong luồng chạy vòng lặp và sau đó lặp () để xử lý thông báo cho đến khi vòng lặp dừng lại.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
AsyncTask
AsyncTask cho phép bạn thực hiện công việc không đồng bộ trên giao diện người dùng của bạn. Nó thực hiện các hoạt động chặn trong luồng công nhân và sau đó xuất bản kết quả trên luồng UI, mà không yêu cầu bạn tự xử lý các luồng và / hoặc xử lý.
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
Xử lý
Trình xử lý cho phép bạn gửi và xử lý các đối tượng Message và Runnable được liên kết với MessageQueue của một luồng.
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
, nó không yêu cầurunOnUiThread()
hoặcContext
biến, tất cả các thói quen đã biến mất! chỉ cần gọiToaster.toast(R.string.my_msg);
ở đây là ví dụ: github.com/shamanland/xdroid-toaster-example