سؤال

كيف يمكنني العرض خبز محمص رسائل من موضوع؟

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك عن طريق الاتصال ActivityrunOnUiThread الطريقة من موضوعك:

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

نصائح أخرى

أحب أن أحصل على طريقة في نشاطي المسمى 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.DURATION_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 لخيط واجهة المستخدم. يحدث هذا النوع من السيناريو عندما لا يمكنك تنفيذ عمليات الشبكة/IO على مؤشر ترابط واجهة المستخدم.

مثال أدناه يتعامل مع هذا السيناريو.

  1. لديك موضوع واجهة المستخدم
  2. عليك أن تبدأ عملية io وبالتالي لا يمكنك الجري Runnable على موضوع واجهة المستخدم. لذا انشر الخاص بك Runnable للمعالج على HandlerThread
  3. احصل على النتيجة من Runnable وأرسله مرة أخرى إلى موضوع واجهة المستخدم وأظهر أ Toast رسالة.

المحلول:

  1. إنشاء معالج وابدأها
  2. إنشاء معالج مع لوبر من HandlerThread:requestHandler
  3. قم بإنشاء معالج مع Looper من الموضوع الرئيسي: 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-and-Why-You-You-Be-Using-them-in-Your-And-And-apps

Android-looper-landlertherthread-i

  1. احصل على مثيل معالج مؤشر ترابط واجهة المستخدم واستخدامه handler.sendMessage();
  2. مكالمة post() طريقة handler.post();
  3. runOnUiThread()
  4. 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();
    }
});

انها عملت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top