Показывать Toast в потоке run () [duplicate]

== проверяет ссылки на объекты, .equals() проверяет строковые значения.

Иногда кажется, что == сравнивает значения, потому что Java делает некоторые закулисные вещи, чтобы убедиться, что одинаковые строки в строке являются одним и тем же объектом.

Для Например:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

Но будьте осторожны с нулями!

== обрабатывает строки null в порядке, но вызов .equals() из пустой строки приведет к исключению:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

Итак, если вы знаете, что fooString1 может но не менее очевидно, что он проверяет значение null (из Java 7):

System.out.print(Objects.equals(fooString1, "bar"));
98
задан Ravindra babu 16 October 2017 в 16:55
поделиться

10 ответов

Вы можете сделать это, вызвав метод Activity runOnUiThread из вашего потока:

activity.runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
    }
});
226
ответ дан Lauri Lehtinen 16 August 2018 в 05:18
поделиться
  • 1
    очень полезно thx – Joel 13 June 2011 в 13:20
  • 2
    Я не уверен, что понимаю, как это сделать. У меня есть существующий public void run (). Я попробовал поставить этот код там. Я знаю, что это неправильно, потому что это не сработало, но я действительно застрял. – SwimBikeRun 4 March 2012 в 08:04
  • 3
    Является ли "активность" передан не-ui-нить в его конструкторе? Каков правильный способ получить объект активности, который вы используете из отдельного потока? – snapfractalpop 15 March 2012 в 19:26
  • 4
    иногда нет доступа к экземпляру Activity, вместо этого вы можете использовать простой вспомогательный класс, см. здесь: stackoverflow.com/a/18280318/1891118 – Oleksii K. 28 August 2013 в 10:27
  • 5
    Обычно я обнаружил, что MyActivity.this.runOnUiThread() отлично работает с внутренним Thread / AsyncTask. – Anthony Atkinson 30 April 2014 в 18:39

Я сделал этот подход на основе ответа 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();
        }
    });
}

Хорошо работал для меня.

2
ответ дан Angelo Polotto 16 August 2018 в 05:18
поделиться

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

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();
            }
        });
    }
}
23
ответ дан ChrisCM 16 August 2018 в 05:18
поделиться

Один подход, который работает практически из любого места, в том числе из мест, где у вас нет 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.

6
ответ дан ddmps 16 August 2018 в 05:18
поделиться

Мне нравится иметь метод в моей деятельности под названием showToast, который я могу вызвать из любого места ...

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

Затем я чаще всего вызываю его из MyActivity на любой поток, например это ...

showToast(getString(R.string.MyMessage));
56
ответ дан mjaggard 16 August 2018 в 05:18
поделиться
  • 1
    Спасибо, сейчас я добавляю эту большую активность. – Gene Myers 1 December 2013 в 19:25
  • 2
    Для TOAST всегда используйте контекст приложения, а не контекст активности! – Yousha Aleayoub 21 September 2015 в 08:35
  • 3
    @YoushaAleayoub почему? – OneWorld 16 February 2016 в 10:44
  • 4
    @OneWorld, доказательства: 1- Для сообщения с тостом руководство Google Dev использует контекст приложения и явно использует его. 2- stackoverflow.com/a/4128799/1429432 3- stackoverflow.com/a/10347346/1429432 4- groups.google.com/d/msg / андроид-разработчиков / 3i8M6-wAIwM / & hellip; – Yousha Aleayoub 16 February 2016 в 18:30
  • 5
    @YoushaAleayoub В ссылках, которые вы предоставили, есть много обсуждений и угадываний. Например. RomainGuy говорит, что в вашем доказательстве нет утечки памяти. 4. Некоторые ссылки связаны с ранними днями Android в 2009 году. Также люди говорят в других ссылках, что вы можете использовать оба контекста. Активность и применение. Возможно, у вас есть более современные доказательства, основанные на доказательствах? У вас есть ссылка на 1? – OneWorld 22 February 2016 в 11:36

Я столкнулся с той же проблемой:

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.

Before: onCreate function

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
    }
});
thread.start();

После: onCreate function

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
    }
});

сработало.

0
ответ дан Paul Chu 16 August 2018 в 05:18
поделиться

Вы можете использовать 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, который вы должны показать тост.

5
ответ дан Ravindra babu 16 August 2018 в 05:18
поделиться

Как этот или этот , с 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();
}
9
ответ дан yanchenko 16 August 2018 в 05:18
поделиться
6
ответ дан Ravindra babu 6 September 2018 в 03:59
поделиться
6
ответ дан Ravindra babu 29 October 2018 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: