Тост-это сбой приложения, даже внутри потока
У меня есть событие onClick в моем android-приложении, которое запускает следующий код, но оно продолжает разрушать мое приложение. Я поместил его в поток только потому, что прочитал, что это должно предотвратить сбой. Также ctx ссылается на контекст действия (это переменная, которую я создал в наборе действий, равном этому. Я прочитал и попробовал несколько вещей. Любая помощь была бы потрясающей. Спасибо!
Thread toastThread = new Thread() {
public void run() {
Toast alertFailure = Toast.makeText(ctx, "Login Failed", Toast.LENGTH_LONG);
alertFailure.show();
}
};
toastThread.start();
5 ответов:
Вам нужно использовать runOnUiThread
Что-то вроде
runOnUiThread(new Runnable() { public void run() { Toast.makeText(ctx, toast, Toast.LENGTH_SHORT).show(); } }); }
Toast
является элементомUI
, поэтому он должен работать наUI Thread
, а не на фонеThread
.Однако, если это все, для чего вы его используете, то вам не нужно отдельное
Thread
, чтобы просто показатьToast
. Если вы можете объяснить контекст того, как вы его используете, тогда, возможно, мы сможем помочь с лучшим способом. Кроме того, если вы находитесь внутри вашегоActivity
, то вам не нужна переменная дляContext
. Вы можете использоватьActivityName.this
вместо этого, чтобы получить доступ кActivity Context
Скорее всего, у вас нет экземпляра переменной ctx, поэтому вы получаете нулевой указатель.
Вы не должны помещать это в поток, и на самом деле это довольно плохая идея (зная, что вы только начинаете).
Выполнить:
adb logcat
, чтобы просмотреть выходные данные журнала.
Вам не нужен другой поток, ваша переменная ctx, вероятно, является его причиной, попробуйте использовать getApplicationContext (), это должно работать:
import android.widget.Toast; Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_LONG).show();
Только mainthread может изменить пользовательский интерфейс. Вот почему ваше приложение аварийно завершает работу. Делайте свою работу на mainthread, и если вы делаете что-то тяжелое, как сеть или ввод-вывод, вы должны использовать
AsyncTask
, потому что у каждого потока есть 5 секунд, чтобы ответить.
Вы можете сделать это вот так.
((Button)findViewById(R.id.myButton)).setOnClickListener(new OnClickListener(){ public void onClick(View v) { Toast.makeText(MyActivity.this, "Login Failed", Toast.LENGTH_LONG).show(); } });
Где:
- myButton-это идентификатор вашего вида
- моя активность - это ваша активность
Я надеюсь, что это поможет вам.