Тост-это сбой приложения, даже внутри потока


У меня есть событие 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 3

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-это идентификатор вашего вида
  • моя активность - это ваша активность

Я надеюсь, что это поможет вам.