আমি কীভাবে কোনও থ্রেড থেকে টোস্ট বার্তাগুলি প্রদর্শন করতে পারি ?
আমি কীভাবে কোনও থ্রেড থেকে টোস্ট বার্তাগুলি প্রদর্শন করতে পারি ?
উত্তর:
আপনি একটি কল করে এটা করতে পারেন Activity
'র runOnUiThread
আপনার থ্রেড থেকে পদ্ধতি:
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
}
});
Thread
থেকে বস্তুর রেফারেন্স Activity
মধ্যে 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
থেকে ইউআই থ্রেডে বার্তা পাঠাতে হবে । আপনি ইউআই থ্রেডে নেটওয়ার্ক / আইও ক্রিয়াকলাপ চালাতে না পারলে এই ধরণের পরিস্থিতি দেখা দেয়।
উদাহরণের নীচে সেই দৃশ্যটি পরিচালনা করে।
Runnable
ইউআই থ্রেডে চালাতে পারবেন না । সুতরাং আপনার 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-এবং-কেন-আপনি-উচিত-করা-ব্যবহার-তাদের-ইন-আপনার-অ্যান্ড্রয়েড-অ্যাপ্লিকেশান
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
আপনি টোস্ট দেখানোর জন্য।
আমি এমজিগার্ড উত্তরের উপর ভিত্তি করে এই পদ্ধতির তৈরি করেছি:
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.
আগে: অনক্রিট ফাংশন
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
}
});
thread.start();
পরে: অনক্রিট ফাংশন
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
}
});
এটা কাজ করেছে.