Android - 如何避免两个runOnUIThread调用之间的死锁

时间:2013-02-08 07:02:16

标签: android multithreading deadlock

我有这个过程,它会运行一些“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都会导致死锁。

如何避免这种僵局?

提前致谢。

1 个答案:

答案 0 :(得分:3)

这些调用不会导致死锁。首先,系统一次运行一个。也就是说,一个(在事件线程上)运行完成(直到run()方法返回),然后另一个队列出事并由事件线程运行。其次,runnables没有锁定资源,因此没有理由发生死锁。

也许您同时关注屏幕上的两个Toast(因为Toast返回后,每个show()都会显示一段时间。唯一的问题是人们会隐藏另一个人;但是,仍然没有僵局。

如果您的应用程序死锁,则问题出在其他地方。