我有这个过程,它会运行一些“if”,具体取决于用户是否插入或弹出内存笔驱动器:
int userStatus = StopActivity.USER_HAS_NEVER_INSERTED_MEMORY;
while (true) {
File usbDirectoryFile = new File(usbDirectory);
if (usbDirectoryFile.exists()) {
verMasInfoDirectory = usbDirectory + File.separator + "vermasinfo";
File verMasInfoDirectoryFile = new File(verMasInfoDirectory);
if (verMasInfoDirectoryFile.exists()) {
break;
} else if (userStatus != StopActivity.USER_HAS_BEEN_NOTIFIED) {
userStatus = StopActivity.USER_HAS_BEEN_NOTIFIED;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(StopActivity.this, R.string.stop_activity_directory_not_exists_toast_text, Toast.LENGTH_LONG).show();
}
});
}
} else if (userStatus == StopActivity.USER_HAS_BEEN_NOTIFIED) {
userStatus = StopActivity.USER_HAS_NOT_BEEN_NOTIFIED;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(StopActivity.this, R.string.stop_activity_ejected_memory_toast_text, Toast.LENGTH_LONG).show();
}
});
}
usbDirectoryFile = null;
}
问题是,当用户快速插入/弹出笔式驱动器时,两次调用runOnUIThread都会导致死锁。
如何避免这种僵局?
提前致谢。
答案 0 :(得分:3)
这些调用不会导致死锁。首先,系统一次运行一个。也就是说,一个(在事件线程上)运行完成(直到run()
方法返回),然后另一个队列出事并由事件线程运行。其次,runnables没有锁定资源,因此没有理由发生死锁。
也许您同时关注屏幕上的两个Toast
(因为Toast
返回后,每个show()
都会显示一段时间。唯一的问题是人们会隐藏另一个人;但是,仍然没有僵局。
如果您的应用程序死锁,则问题出在其他地方。