অ্যান্ড্রয়েডের পটভূমির থ্রেড থেকে আপনি কীভাবে টোস্ট প্রদর্শন করবেন?


113

আমি কীভাবে কোনও থ্রেড থেকে টোস্ট বার্তাগুলি প্রদর্শন করতে পারি ?


এই প্রশ্নের উত্তর বিস্তারিতভাবে।
mjosh

এই উত্তরটি সংক্ষিপ্ত সমাধান সরবরাহ করে: স্ট্যাকওভারফ্লো.
com

উত্তর:


246

আপনি একটি কল করে এটা করতে পারেন Activity'র runOnUiThreadআপনার থ্রেড থেকে পদ্ধতি:

activity.runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
    }
});

আমি নিশ্চিত না যে আমি এটি কীভাবে করব তা বুঝতে পেরেছি। আমি আমার বিদ্যমান পাবলিক অকার্যকর রান ()। আমি এই কোডটি এখানে রাখার চেষ্টা করেছি। আমি জানি যে এটি সঠিক নয় কারণ এটি কাজ করে না, তবে আমি সত্যিই আটকে আছি।
সুইমবাইকআরুন

14
"ক্রিয়াকলাপ" এর নির্মাতায় নন-ইউআই-থ্রেডে পাস হয়েছে? আপনি আলাদা থ্রেডের মধ্যে থেকে যে কার্যকলাপ ক্রিয়াকলাপটি ব্যবহার করছেন তা পাওয়ার সঠিক উপায় কী?
স্ন্যাপফ্র্যাক্টলপপ

সেট Threadথেকে বস্তুর রেফারেন্স Activityমধ্যে Activityএর onResume। এতে আনসেট Activityএর onPause। উভয় একটি synchronizedলক অধীনে যে উভয় Activityএবং Threadসম্মান।
জনিলম্বদা

5
কখনও কখনও Activityউদাহরণ অ্যাক্সেস নেই , আপনি পরিবর্তে সাধারণ সহায়ক-বর্গ ব্যবহার করতে পারেন, এখানে দেখুন: stackoverflow.com/a/18280318/1891118
ওলেক্সি কে।

5
আমি সাধারণত খুঁজে পেয়েছি যে MyActivity.this.runOnUiThread()কোনও অভ্যন্তর Thread/ থেকে ঠিক ঠিক কাজ করে AsyncTask
অ্যান্টনি অ্যাটকিনসন

62

আমি আমার ক্রিয়াকলাপে এমন একটি পদ্ধতি বলতে চাই showToastযা আমি যে কোনও জায়গা থেকে কল করতে পারি ...

public void showToast(final String toast)
{
    runOnUiThread(() -> Toast.makeText(MyActivity.this, toast, Toast.LENGTH_SHORT).show());
}

আমি তখন প্রায়শই প্রায়শই MyActivityএ জাতীয় কোনও থ্রেড থেকে কল করি ...

showToast(getString(R.string.MyMessage));

3
ধন্যবাদ, আমি এখন এটি সর্বাধিক ক্রিয়াকলাপ যুক্ত করছি।
জিন মাইয়ার্স

1
টোস্টের জন্য, সর্বদা অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করুন, ক্রিয়াকলাপ প্রসঙ্গে নয়!
ইউশা আলেয়াউব

1
@ ইউসু আলেয়াউব কেন?
ওয়ানওয়ার্ল্ড

1
@ ওয়ানওয়ার্ড, প্রমাণ: 1- টোস্ট বার্তার জন্য, গুগল দেব গাইড অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করে এবং স্পষ্টভাবে এটি ব্যবহার করার জন্য বলে say 2- stackoverflow.com/a/4128799/1429432 3- stackoverflow.com/a/10347346/1429432 4 groups.google.com/d/msg/android-developers/3i8M6-wAIwM/...
Yousha Aleayoub

@ ইউশাআলায়েউব আপনার প্রদত্ত লিঙ্কগুলিতে অনেক আলোচনা এবং অনুমান করা হচ্ছে। যেমন রোমেনগুই বলেছেন যে আপনার নং প্রুফের কোনও মেমরি ফাঁস নেই। ৪. কিছু লিঙ্কগুলি ২০০৯-এ অ্যান্ড্রয়েডের প্রথম দিনগুলির are এছাড়াও লোকেরা অন্যান্য লিঙ্কগুলিতে বলে যে আপনি উভয় প্রসঙ্গ ব্যবহার করতে পারেন। ক্রিয়াকলাপ এবং অ্যাপ্লিকেশন। হতে পারে আপনার কাছে বাস্তব প্রমাণ ভিত্তিক প্রমাণের চেয়ে আরও আধুনিকতা আছে? আপনার কি 1 এর জন্য একটি লিঙ্ক আছে?
ওয়ানওয়ার্ল্ড

28

এটি অন্যান্য জবাবগুলির মতো, তবে নতুন উপলভ্য এপিআইএস এবং অনেক ক্লিনারের জন্য আপডেট হয়েছে। এছাড়াও, আপনি কোনও কার্যকলাপের প্রসঙ্গে রয়েছেন বলে ধরে নি।

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();
            }
        });
    }
}

আপনার কাছে থাকা প্রসঙ্গটি কোনও ক্রিয়াকলাপ নয় যা সঠিক উত্তর। অনেক ধন্যবাদ!
ফ্র্যাঙ্কাস

17

একটা পদক্ষেপ সহ প্রায় কাছাকাছি কোন জায়গায়, স্থান থেকে কাজ যেখানে আপনি একটি আছে না যে 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


10

ভালো লেগেছে এই বা এই , একটি সঙ্গে 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();
}

6

কখনও কখনও, আপনাকে অন্য Threadথেকে ইউআই থ্রেডে বার্তা পাঠাতে হবে । আপনি ইউআই থ্রেডে নেটওয়ার্ক / আইও ক্রিয়াকলাপ চালাতে না পারলে এই ধরণের পরিস্থিতি দেখা দেয়।

উদাহরণের নীচে সেই দৃশ্যটি পরিচালনা করে।

  1. আপনার কাছে ইউআই থ্রেড রয়েছে
  2. আপনাকে আইও অপারেশন শুরু করতে হবে এবং তাই আপনি Runnableইউআই থ্রেডে চালাতে পারবেন না । সুতরাং আপনার Runnableপরিচালনা করতে পোস্ট করুনHandlerThread
  3. এর থেকে ফলাফল পান Runnableএবং এটি আবার ইউআই থ্রেডে প্রেরণ করুন এবং একটি Toastবার্তা দেখান ।

সমাধান:

  1. একটি হ্যান্ডলারথ্রেড তৈরি করুন এবং এটি শুরু করুন
  2. এর থেকে লুপের সাথে একটি হ্যান্ডলার তৈরি করুন :HandlerThreadrequestHandler
  3. প্রধান থ্রেড থেকে লুপার সহ একটি হ্যান্ডলার তৈরি করুন: responseHandlerএবং ওভাররাইড handleMessageপদ্ধতি
  4. postএকটি RunnableকাজrequestHandler
  5. ভিতরে Runnableটাস্ক, কল sendMessageকরুনresponseHandler
  6. এই sendMessageফল আবাহন handleMessageমধ্যে responseHandler
  7. থেকে বৈশিষ্ট্যগুলি পান 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-এবং-কেন-আপনি-উচিত-করা-ব্যবহার-তাদের-ইন-আপনার-অ্যান্ড্রয়েড-অ্যাপ্লিকেশান

অ্যান্ড্রয়েড-looper-হ্যান্ডলার-handlerthread-ই


5
  1. ইউআই থ্রেড হ্যান্ডলার উদাহরণ এবং ব্যবহার করুন handler.sendMessage();
  2. কল post()পদ্ধতিhandler.post();
  3. runOnUiThread()
  4. view.post()

3

আপনি বার্তা 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আপনি টোস্ট দেখানোর জন্য।


2

আমি এমজিগার্ড উত্তরের উপর ভিত্তি করে এই পদ্ধতির তৈরি করেছি:

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();
        }
    });
}

আমার জন্য ভাল কাজ করেছে।


0

আমি একই সমস্যার মুখোমুখি হয়েছি :

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();
    }
});

এটা কাজ করেছে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.