मैं एक धागे से टोस्ट संदेश कैसे प्रदर्शित कर सकता हूं ?
मैं एक धागे से टोस्ट संदेश कैसे प्रदर्शित कर सकता हूं ?
जवाबों:
आप एक फोन करके यह कर सकते हैं Activity
की runOnUiThread
अपने धागे से विधि:
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
}
});
Thread
ऑब्जेक्ट के संदर्भ को 's' Activity
में सेट करें । इसे 's' में बंद करें । एक ताले के नीचे दोनों करें और सम्मान करें। Activity
onResume
Activity
onPause
synchronized
Activity
Thread
Activity
उदाहरण तक पहुंच नहीं होती है , आप इसके बजाय सरल सहायक वर्ग का उपयोग कर सकते हैं, यहां देखें: stackoverflow.com/a/18280318/1891118
MyActivity.this.runOnUiThread()
भीतर से ठीक काम करता है Thread
/ AsyncTask
।
मुझे अपनी गतिविधि में एक विधि पसंद है showToast
जिसे मैं कहीं से भी कॉल कर सकता हूं ...
public void showToast(final String toast)
{
runOnUiThread(() -> Toast.makeText(MyActivity.this, toast, Toast.LENGTH_SHORT).show());
}
मैं तो सबसे अक्सर इसे MyActivity
किसी भी धागे पर इस तरह से भीतर से बुलाता हूं ...
showToast(getString(R.string.MyMessage));
यह अन्य उत्तरों के समान है, हालांकि नए उपलब्ध एपिस और बहुत क्लीनर के लिए अद्यतन किया गया है। इसके अलावा, यह नहीं मानते कि आप एक गतिविधि के संदर्भ में हैं।
public class MyService extends AnyContextSubclass {
public void postToastMessage(final String message) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();
}
});
}
}
एक दृष्टिकोण जो कहीं से भी बहुत अधिक काम करता है, जिसमें उन जगहों से भी शामिल है जहां आपके पास Activity
या नहीं है View
, Handler
मुख्य धागे को हथियाने और टोस्ट दिखाने के लिए है:
public void toast(final Context context, final String text) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
Toast.makeText(context, text, Toast.LENGTH_LONG).show();
}
});
}
इस दृष्टिकोण का लाभ यह है कि यह किसी भी Context
, सहित Service
और के साथ काम करता है Application
।
जैसा इस या इस एक के साथ Runnable
शो Toast
। अर्थात्,
Activity activity = // reference to an Activity
// or
View view = // reference to a View
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
showToast(activity);
}
});
// or
view.post(new Runnable() {
@Override
public void run() {
showToast(view.getContext());
}
});
private void showToast(Context ctx) {
Toast.makeText(ctx, "Hi!", Toast.LENGTH_SHORT).show();
}
कभी-कभी, आपको Thread
यूआई थ्रेड से दूसरे को संदेश भेजना होगा । इस प्रकार का परिदृश्य तब होता है जब आप UI थ्रेड पर नेटवर्क / IO कार्रवाई निष्पादित नहीं कर सकते।
उदाहरण के नीचे उस परिदृश्य को संभालता है।
Runnable
UI थ्रेड पर नहीं चल सकते । तो अपने Runnable
हैंडलर को पोस्ट करेंHandlerThread
Runnable
और इसे यूआई थ्रेड पर वापस भेजें और एक Toast
संदेश दिखाएं ।उपाय:
HandlerThread
:requestHandler
responseHandler
और ओवरराइड handleMessage
विधिpost
एक Runnable
कार्य परrequestHandler
Runnable
कार्य, sendMessage
पर कॉल करेंresponseHandler
sendMessage
परिणाम में आह्वान handleMessage
है responseHandler
।Message
और इसे संसाधित, अद्यतन यूआईनमूना कोड:
/* Handler thread */
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
final Handler responseHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//txtView.setText((String) msg.obj);
Toast.makeText(MainActivity.this,
"Runnable on HandlerThread is completed and got result:"+(String)msg.obj,
Toast.LENGTH_LONG)
.show();
}
};
for ( int i=0; i<5; i++) {
Runnable myRunnable = new Runnable() {
@Override
public void run() {
try {
/* Add your business logic here and construct the
Messgae which should be handled in UI thread. For
example sake, just sending a simple Text here*/
String text = "" + (++rId);
Message msg = new Message();
msg.obj = text.toString();
responseHandler.sendMessage(msg);
System.out.println(text.toString());
} catch (Exception err) {
err.printStackTrace();
}
}
};
requestHandler.post(myRunnable);
}
उपयोगी लेख:
handlerthreads और क्यों में आप चाहिए होने वाली का उपयोग कर-उन्हें-इन-अपने-android-क्षुधा
handler.sendMessage();
post()
विधिhandler.post();
runOnUiThread()
view.post()
आप संदेश Looper
भेजने के लिए उपयोग कर सकते हैं Toast
। अधिक जानकारी के लिए इस लिंक पर जाएं ।
public void showToastInThread(final Context context,final String str){
Looper.prepare();
MessageQueue queue = Looper.myQueue();
queue.addIdleHandler(new IdleHandler() {
int mReqCount = 0;
@Override
public boolean queueIdle() {
if (++mReqCount == 2) {
Looper.myLooper().quit();
return false;
} else
return true;
}
});
Toast.makeText(context, str,Toast.LENGTH_LONG).show();
Looper.loop();
}
और इसे आपके धागे में कहा जाता है। प्रसंग हो सकता है Activity.getContext()
से हो रही Activity
आप टोस्ट को दिखाने के लिए।
मैंने यह दृष्टिकोण mjaggard उत्तर के आधार पर बनाया है:
public static void toastAnywhere(final String text) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
Toast.makeText(SuperApplication.getInstance().getApplicationContext(), text,
Toast.LENGTH_LONG).show();
}
});
}
मेरे लिए अच्छा काम किया।
मैंने उसी समस्या का सामना किया :
E/AndroidRuntime: FATAL EXCEPTION: Thread-4
Process: com.example.languoguang.welcomeapp, PID: 4724
java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
at android.widget.Toast$TN.<init>(Toast.java:393)
at android.widget.Toast.<init>(Toast.java:117)
at android.widget.Toast.makeText(Toast.java:280)
at android.widget.Toast.makeText(Toast.java:270)
at com.example.languoguang.welcomeapp.MainActivity$1.run(MainActivity.java:51)
at java.lang.Thread.run(Thread.java:764)
I/Process: Sending signal. PID: 4724 SIG: 9
Application terminated.
से पहले: onCreate फ़ंक्शन
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
}
});
thread.start();
के बाद: onCreate फ़ंक्शन
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
}
});
इसने काम कर दिया।