使用UI线程显示Toast消息?

时间:2014-05-09 20:28:51

标签: java android multithreading toast

我有一个从单独进程获取更新的侦听器。 (我使用的是IPC。)

  Log.i("Test1", Thread.currentThread().toString()); // Thread[Binder_3,5,main]

  runOnUiThread(new Runnable() {

    @Override
    public void run() {
      Log.i("Test2", Thread.currentThread().toString()); // Thread[main,5,main]
      switch (taskId) {
      case Constants.DOWNLOAD_TASK_EXECUTED: {
        long time = prefs.getLong(Constants.LAST_UPDATED_KEY, System.currentTimeMillis());
        String msg = Utils.getLastUpdatedString(res, time, Locale.getDefault(), false);
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
        break;
      }
      case Constants.DELETED_TASK_EXECUTED: {
        String msg = res.getString(R.string.delete_success);
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
        break;
      }
      }
    }

  });

当我获得更新时,是否需要调用runOnUiThread方法并传入Runnable以显示Toast消息?或者可以将它们显示在同一个线程(Binder_3)中吗?我没有在UI中修改任何内容。

2 个答案:

答案 0 :(得分:5)

Tost或Log在线程或其他进程中工作(但最好不要冒险!)但是更改UI必须始终按照您使用runOnUiThread或使用handler

Handler handler = new Handler();
handler.post(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
});

答案 1 :(得分:1)

我的专业Android 4应用程序开发书指出,"必须创建Toast并在GUI线程上显示;否则,你冒着抛出跨线程异常的风险。"