我有一个从单独进程获取更新的侦听器。 (我使用的是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中修改任何内容。
答案 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线程上显示;否则,你冒着抛出跨线程异常的风险。"