GÜNCELLEME - 2016
İyi alternatiftir kullanmaktır RxAndroid
(özel bağlamaları RxJava
için) P
içinde MVP
veri fo almaya gider.
Observable
Mevcut yönteminizden dönerek başlayın .
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Bu Gözlemlenebilir'i şu şekilde kullanın -
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Biraz geç kaldığımı biliyorum ama işte gidiyor. Android temel olarak UI iş parçacığı ve arka plan iş parçacığı olmak üzere iki iş parçacığı türünde çalışır . Android belgelerine göre -
Bu sorunu çözmek için Android UI araç setine UI iş parçacığının dışından erişmeyin, Android diğer iş parçacıklarından UI iş parçacığına erişmek için çeşitli yollar sunar. İşte size yardımcı olabilecek yöntemlerin bir listesi:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Şimdi bu sorunu çözmek için çeşitli yöntemler var.
Kod örneği ile açıklayacağım:
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
Bir iş parçacığı için bir ileti döngüsü çalıştırmak için kullanılan sınıf. Varsayılan olarak, iş parçacıklarının kendileriyle ilişkili bir mesaj döngüsü yoktur; bir tane oluşturmak için, döngüyü çalıştıracak olan iş parçacığında ready () öğesini çağırın ve sonra döngü durdurulana kadar iletileri işlemesini sağlamak için loop () öğesini çağırın.
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, kullanıcı arayüzünüzde eşzamansız çalışma yapmanızı sağlar. Bir çalışan iş parçacığında engelleme işlemlerini gerçekleştirir ve daha sonra iş parçacıklarını ve / veya işleyicileri kendiniz kullanmanıza gerek kalmadan sonuçları UI iş parçacığında yayınlar.
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
Bir işleyici, bir iş parçacığının MessageQueue ile ilişkili Message ve Runnable nesneleri göndermenizi ve işlemenizi sağlar.
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'
, gereklirunOnUiThread()
veyaContext
değişken değil , tüm rutin gitti! sadeceToaster.toast(R.string.my_msg);
burada çağırmak örnek: github.com/shamanland/xdroid-toaster-example