2

ユーザーがメモリペンドライブを挿入するか取り出すかによって、いくつかの「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 の両方の呼び出しがデッドロックを引き起こす可能性があることです。

どうすればそのデッドロックを回避できますか?

前もって感謝します。

4

1 に答える 1

3

これらの呼び出しによってデッドロックが発生することはありません。まず、システムによって一度に1つずつ実行されます。つまり、一方は(イベントスレッドで)完了まで(run()メソッドが戻るまで)実行されてから、もう一方はデキューされてイベントスレッドによって実行されます。次に、ランナブルはリソースをロックしていないため、デッドロックの理由はありません。

Toastおそらく、画面上に同時に2つあることを心配しているでしょう(それぞれが戻っToastた後しばらくの間表示されているため)。show()これに関する唯一の問題は、一方が他方を隠すことです。ただし、デッドロックはまだありません。

アプリがデッドロックしている場合、問題は他の場所にあります。

于 2013-02-08T07:17:27.047 に答える