从我的线程执行时,Activity忽略显示Toasts

时间:2011-03-27 19:04:13

标签: android multithreading toast

为什么我只看到“第一次”吐司而不是其他(应该)从我的帖子中创建?

public class BannerExample extends Activity {

    @Override
    public void onCreate(final Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Toast toast = Toast.makeText(this, "first toast", Toast.LENGTH_SHORT);
        toast.show();

        new MyThread(this).start();

    }

    class MyThread extends Thread {

        private Context context;

        public MyThread(Context context) {
            this.context = context;
        }

        public void run() {

            Looper.prepare(); // An exception told me to add this - i have no clue why

            for (int i = 0; i < 3; i++) {

                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                Toast toast = Toast.makeText(context, i + "whoho", Toast.LENGTH_SHORT);
                toast.show();
            }

        }

    }

}

1 个答案:

答案 0 :(得分:1)

  1. 您不应该致电Looper.prepare。你得到了例外,因为你做错了什么:
  2. Toasts是UI工具包的一部分,因此必须从UI线程访问 - 这就是您获得异常的原因
  3. 我建议您为AsyncTask交换Thread并使用onProgressUpdate方法创建吐司,因为这会自动在UI线程上运行。否则你需要使用一个处理程序。
  4. 将上下文从getBaseContext而不是当前活动的上下文传递给构造函数
相关问题