Вопрос

Как я могу отобразить Тост Сообщения из потока?

Это было полезно?

Решение

Вы можете сделать это, позвонив ActivityС. runOnUiThread Метод из вашей темы:

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

Это похоже на другие ответы, однако обновляются для новых доступных API и намного очистителя. Также не предполагает, что вы находитесь в контексте деятельности.

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 в пользовательскую ниту. Этот тип сценария возникает, когда вы не можете выполнить операции Network / IO на потоке UI.

Ниже пример обрабатывает этот сценарий.

  1. У вас есть UI
  2. Вы должны начать операцию IO и, следовательно, вы не можете запустить Runnable на UI поток. Так что выставите свой Runnable обработчик включен HandlerThread
  3. Получить результат от Runnable и отправьте его обратно в ui поток и показать Toast сообщение.

Решение:

  1. Создать HandlerTread. и начните его
  2. Создать Обработчик с участием Петли от HandlerThread:requestHandler
  3. Создайте обработчик с петлером из основного потока: responseHandler и переопределить handleMessage метод
  4. post а. Runnable задача включена requestHandler
  5. Внутри Runnable Задача, звонок sendMessage на responseHandler
  6. Этот sendMessage Вызов результата handleMessage в responseHandler.
  7. Получить атрибуты из Message и обрабатывать его, обновите UI

Образец кода:

    /* 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-of-you-and-anive-in-in-your-android-приложения

Android-Looper-Handler-HandlerTread-I

  1. Получить экземпляр обработчика поток UI и использовать 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 Rapice:

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