मैं एक धागे से टोस्ट संदेश कैसे प्रदर्शित कर सकता हूं ?
मैं एक धागे से टोस्ट संदेश कैसे प्रदर्शित कर सकता हूं ?
जवाबों:
आप एक फोन करके यह कर सकते हैं Activityकी runOnUiThreadअपने धागे से विधि:
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
}
});
Threadऑब्जेक्ट के संदर्भ को 's' Activityमें सेट करें । इसे 's' में बंद करें । एक ताले के नीचे दोनों करें और सम्मान करें। ActivityonResumeActivityonPausesynchronizedActivityThread
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 कार्रवाई निष्पादित नहीं कर सकते।
उदाहरण के नीचे उस परिदृश्य को संभालता है।
RunnableUI थ्रेड पर नहीं चल सकते । तो अपने Runnableहैंडलर को पोस्ट करेंHandlerThreadRunnableऔर इसे यूआई थ्रेड पर वापस भेजें और एक Toastसंदेश दिखाएं ।उपाय:
HandlerThread:requestHandlerresponseHandlerऔर ओवरराइड handleMessageविधिpostएक Runnableकार्य परrequestHandlerRunnableकार्य, sendMessageपर कॉल करेंresponseHandlersendMessageपरिणाम में आह्वान 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();
}
});
इसने काम कर दिया।