UPDATE - 2016
Alternatif terbaik adalah dengan menggunakan RxAndroid
(binding spesifik untuk RxJava
) untuk P
di MVP
untuk mengambil alih fo data.
Mulailah dengan kembali Observable
dari metode yang ada.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Gunakan ini Teramati seperti ini -
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Saya tahu saya sedikit terlambat tetapi ini dia. Android pada dasarnya bekerja pada dua jenis utas yaitu utas UI dan utas latar . Menurut dokumentasi android -
Jangan mengakses toolkit UI Android dari luar utas UI untuk memperbaiki masalah ini, Android menawarkan beberapa cara untuk mengakses utas UI dari utas lainnya. Berikut adalah daftar metode yang dapat membantu:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Sekarang ada berbagai metode untuk mengatasi masalah ini.
Saya akan menjelaskannya dengan contoh kode:
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new Runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
LOOPER
Kelas yang digunakan untuk menjalankan loop pesan untuk utas. Utas secara default tidak memiliki loop pesan yang terkait dengannya; untuk membuatnya, panggil prep () di utas yang menjalankan loop, dan kemudian loop () agar prosesnya pesan sampai loop dihentikan.
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 memungkinkan Anda melakukan pekerjaan asinkron pada antarmuka pengguna Anda. Ia melakukan operasi pemblokiran pada utas pekerja dan kemudian menerbitkan hasilnya pada utas UI, tanpa mengharuskan Anda untuk menangani utas dan / atau penangan sendiri.
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
}
}
Handler
Handler memungkinkan Anda mengirim dan memproses objek Message dan Runnable yang terkait dengan ThreadQueue utas.
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'
, itu tidak memerlukanrunOnUiThread()
atauContext
variabel, semua rutin hilang! hanya memohon diToaster.toast(R.string.my_msg);
sini adalah contoh: github.com/shamanland/xdroid-toaster-example