अद्यतन - 2016
सबसे अच्छा विकल्प का उपयोग करने के लिए है RxAndroid
(के लिए विशिष्ट बाइंडिंग RxJava
के लिए) P
में MVP
प्रभारी डेटा के लिए लेने के लिए।
Observable
अपने मौजूदा तरीके से लौटकर शुरू करें ।
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
इस तरह इस अवलोकन का उपयोग करें -
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
मुझे पता है कि मुझे थोड़ी देर हो गई है लेकिन यहां जाता हूं। एंड्रॉइड मूल रूप से दो थ्रेड प्रकारों पर कार्य करता है जैसे UI थ्रेड और बैकग्राउंड थ्रेड । Android प्रलेखन के अनुसार -
इस समस्या को ठीक करने के लिए UI थ्रेड के बाहर से एंड्रॉइड यूआई टूलकिट का उपयोग न करें, एंड्रॉइड यूआई थ्रेड को अन्य थ्रेड्स से एक्सेस करने के कई तरीके प्रदान करता है। यहां उन तरीकों की सूची दी गई है जो मदद कर सकते हैं:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
अब इस समस्या को हल करने के लिए विभिन्न तरीके हैं।
मैं इसे कोड नमूने द्वारा समझाऊंगा:
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
क्लास एक थ्रेड के लिए एक संदेश लूप चलाने के लिए उपयोग किया जाता है। डिफ़ॉल्ट रूप से थ्रेड्स में एक संदेश लूप नहीं होता है जो उनके साथ जुड़ा हुआ है; एक बनाने के लिए, कॉल तैयारी () थ्रेड में जो लूप को चलाने के लिए है, और फिर लूप () लूप बंद होने तक संदेशों को संसाधित करने के लिए।
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 आपको अपने यूजर इंटरफेस पर अतुल्यकालिक कार्य करने की अनुमति देता है। यह वर्कर थ्रेड में ब्लॉकिंग ऑपरेशंस करता है और फिर यूआई थ्रेड पर रिजल्ट प्रकाशित करता है, बिना आपको थ्रेड और / या हैंडलर को संभालने की आवश्यकता होती है।
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
}
}
हैंडलर
एक हैंडलर आपको थ्रेड के MessageQueue से जुड़े संदेश और Runnable ऑब्जेक्ट को भेजने और संसाधित करने की अनुमति देता है।
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'
, इसकी आवश्यकता नहीं हैrunOnUiThread()
याContext
परिवर्तनशील नहीं है , सभी दिनचर्या समाप्त हो गई है!Toaster.toast(R.string.my_msg);
यहाँ केवल उदाहरण है: github.com/shamanland/xdroid-toaster-example