आप एंड्रॉइड पर पृष्ठभूमि थ्रेड से टोस्ट कैसे प्रदर्शित करते हैं?


113

मैं एक धागे से टोस्ट संदेश कैसे प्रदर्शित कर सकता हूं ?


यह प्रश्न का उत्तर विस्तार से देता है।
मज्जोश

यह उत्तर सबसे छोटा समाधान प्रदान करता है: stackoverflow.com/a/18280318/1891118
ओलेक्सी के।

जवाबों:


246

आप एक फोन करके यह कर सकते हैं Activityकी runOnUiThreadअपने धागे से विधि:

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

मुझे यकीन नहीं है कि मैं समझ सकता हूं कि यह कैसे करना है। मेरे पास मेरा मौजूदा सार्वजनिक शून्य रन () है। मैंने इस कोड को वहां डालने की कोशिश की। मुझे पता है कि यह सही नहीं है क्योंकि यह काम नहीं करता था, लेकिन मैं वास्तव में फंस गया हूं।
SwimBikeRun

14
क्या "गतिविधि" इसके निर्माता में गैर-यूआई-थ्रेड को पारित की गई है? गतिविधि ऑब्जेक्ट को प्राप्त करने का सही तरीका क्या है जिसे आप अलग थ्रेड के भीतर से उपयोग कर रहे हैं?
स्नैपफ्रैक्टलप

Threadऑब्जेक्ट के संदर्भ को 's' Activityमें सेट करें । इसे 's' में बंद करें । एक ताले के नीचे दोनों करें और सम्मान करें। ActivityonResumeActivityonPausesynchronizedActivityThread
जॉनी लैलाबाड़ा

5
कभी-कभी Activityउदाहरण तक पहुंच नहीं होती है , आप इसके बजाय सरल सहायक वर्ग का उपयोग कर सकते हैं, यहां देखें: stackoverflow.com/a/18280318/1891118
Oleksii K.

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
@YoushaAleayoub क्यों?
OneWorld

1
@OneWorld, सबूत: 1- टोस्ट संदेश के लिए, Google देव गाइड एप्लिकेशन संदर्भ का उपयोग करता है और स्पष्ट रूप से इसका उपयोग करने के लिए कहता है। 2- stackoverflow.com/a/4128799/1429432 3 stackoverflow.com/a/10347346/1429432 4- groups.google.com/d/msg/android-developers/3i8M6-wAIwM/...
Yousha Aleayoub

@YoushaAleayoub आपके द्वारा दिए गए लिंक में बहुत चर्चा और अनुमान लगा रहा है। Eg RomainGuy कहते हैं कि आपके प्रमाण संख्या में कोई स्मृति रिसाव नहीं है। 4. कुछ लिंक 2009 में एंड्रॉइड के शुरुआती दिनों से हैं। साथ ही लोग अन्य लिंक में कहते हैं कि आप दोनों संदर्भों का उपयोग कर सकते हैं। गतिविधि और आवेदन। हो सकता है कि आपके पास वास्तविक साक्ष्य आधारित प्रमाण के लिए एक अधिक तारीख हो? क्या आपके पास 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यूआई थ्रेड से दूसरे को संदेश भेजना होगा । इस प्रकार का परिदृश्य तब होता है जब आप UI थ्रेड पर नेटवर्क / IO कार्रवाई निष्पादित नहीं कर सकते।

उदाहरण के नीचे उस परिदृश्य को संभालता है।

  1. आपके पास UI थ्रेड है
  2. आपको IO ऑपरेशन शुरू करना होगा और इसलिए आप RunnableUI थ्रेड पर नहीं चल सकते । तो अपने Runnableहैंडलर को पोस्ट करेंHandlerThread
  3. से परिणाम प्राप्त करें Runnableऔर इसे यूआई थ्रेड पर वापस भेजें और एक Toastसंदेश दिखाएं ।

उपाय:

  1. एक हैंडलर बनाएँ और इसे शुरू करें
  2. एक बनाएं हैंडलर साथ Looper से HandlerThread:requestHandler
  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 और क्यों में आप चाहिए होने वाली का उपयोग कर-उन्हें-इन-अपने-android-क्षुधा

android-looper-हैंडलर-handlerthread-मैं


5
  1. UI थ्रेड हैंडलर उदाहरण प्राप्त करें और उपयोग करें 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

मैंने यह दृष्टिकोण 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();
        }
    });
}

मेरे लिए अच्छा काम किया।


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.

से पहले: 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();
    }
});

इसने काम कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.