Вопрос по android – Использование тоста внутри таймерной задачи

3

Нашел кого-то похожую проблему онлайнВот.

Это не работает:

<code>Timer t = new Timer(false);
t.schedule(new TimerTask() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show();
}
}, 5000);
</code>

Но если я создаю тост за пределами таймера, то покажу его внутриrun,оно работает.

Я думаю, что это может касаться так называемого потока пользовательского интерфейса,

а как именно?

@ Eng.Fouad, есть еще детали? new_perl
Вы не можете использовать Toast или делать какие-либо обновления пользовательского интерфейса из не-пользовательского потока. Eng.Fouad
посмотри в конецthis pageособенно там, где говорится:Make sure that you access the Android UI toolkit only on the UI thread. Eng.Fouad
@ Eng.Fouad, я ищу более внутреннюю причину new_perl

Ваш Ответ

3   ответа
1

я полагаю, что поток не имеет доступа кgetApplicationContext, Правильный способ сделать это - использоватьHandler и позвонитьpostDelayed метод обработчика, который не запускает новый поток.

Читайте об этом:http://developer.android.com/resources/articles/timed-ui-updates.html

Ссылка, которую вы разместили, имеет рабочий пример, который является правильным способом сделать это:

final Context ctx = this;
Handler mHandler = new Handler();

Runnable
makeToast = new Runnable() {
    public void run() {
        Toast.makeText(ctx, "msg", Toast.LENGTH_LONG).show();
    }
};
mHandler.postDelayed(makeToast, 1000);
Я тоже пробовалActivityClassName.thisэто также не работает, почему? new_perl
9

Timer t = new Timer(false);
t.schedule(new TimerTask() {
@Override
public void run() {
       runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show();
            }
        });

    }
}, 5000);
Почти идеально, но вы не должны использовать ApplicationContext для тоста, вы должны использовать Activity.
Я знаю, что есть несколько способов заставить его работать, но я просто не знаю, почему оригинальный способ НЕ работает, и почему он работает, если тост создается снаружи. new_perl
0

когда вы запускаете приложение, оно запускается в потоке пользовательского интерфейса (также называемом основным потоком).

, когда вы создаете новый поток, или таймер, или AsyncTask, по определению они создают новые потоки. Потоки, которые не являются основными, просто не имеют разрешения на изменение пользовательского интерфейса.

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