-1

メッセージとハンドラーを使用して、スレッドの実行中に表示されるプロセスダイアログのメッセージを変更しています。コードを以下に示します。

final ProgressDialog processdialog = ProgressDialog
        .show(MultiBootManager.this, EMPTY,
                EMPTY, true);
final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.arg1) {
        case 0:
            System.out.println("msg0");
            processdialog
                    .setMessage(getString(R.string.formating)
                            + folderpath
                            + getString(R.string.cachext3));
        case 1:
            System.out.println("msg1");
            processdialog
                    .setMessage(getString(R.string.formating)
                            + folderpath
                            + getString(R.string.dataext3));
        case 2:
            System.out.println("msg2");
            processdialog
                    .setMessage(getString(R.string.formating)
                            + folderpath
                            + getString(R.string.systemext3));
        case 3:
            System.out.println("endmsg");
            processdialog.dismiss();

        }
    }
};
Thread checkUpdate = new Thread() {
    @Override
    public void run() {
        String[] shellinput = { EMPTY,
                EMPTY, EMPTY, EMPTY, EMPTY };
        shellinput[0] = CMD_MKE2FS_EXT3;
        shellinput[1] = folderpath;
        if (cacheCheckBool) {
            final Message m0 = new Message();
            m0.arg1 = 0;
            handler.sendMessage(m0);
            shellinput[2] = CACHE_IMG;
            processManager
                    .inputStreamReader(
                            shellinput, 20);
        }
        if (dataCheckBool) {
            final Message m1 = new Message();
            m1.arg1 = 1;
            handler.sendMessage(m1);
            shellinput[2] = DATA_IMG;
            processManager
                    .inputStreamReader(
                            shellinput, 20);
        }
        final Message endmessage;
        if (systemCheckBool) {
            final Message m2 = new Message();
            m2.arg1 = 2;
            handler.sendMessage(m2);
            shellinput[2] = DATA_IMG;
            processManager
                    .inputStreamReader(
                            shellinput, 20);
        }
        endmessage = new Message();
        endmessage.arg1 = 3;
        handler.sendMessage(endmessage);
    }
};
checkUpdate.start();

}

私が今経験している問題はendmessage、操作が完了する前に送信され、ProcessDialog0.5秒ほどで終了することです。すべてBooleanが真である場合、それはmsg1, msg2, msg3, emdmsg急速に表示されSystem.outて閉じます。なぜこの振る舞い?どうすれば修正できますか?

4

2 に答える 2

1

それぞれの場合に休憩を追加する必要があります。そうしないと、実行は次のケースにフォールスルーします。

public void handleMessage(Message msg) {
    switch (msg.arg1) {
    case 0:
        System.out.println("msg0");
        processdialog
                .setMessage(getString(R.string.formating)
                        + folderpath
                        + getString(R.string.cachext3));
        break;
    case 1:
        System.out.println("msg1");
        processdialog
                .setMessage(getString(R.string.formating)
                        + folderpath
                        + getString(R.string.dataext3));
        break;
    case 2:
        System.out.println("msg2");
        processdialog
                .setMessage(getString(R.string.formating)
                        + folderpath
                        + getString(R.string.systemext3));
        break;
    case 3:
        System.out.println("endmsg");
        processdialog.dismiss();
        break;
    }

最後の休憩は厳密には必要ありませんが、常に休憩で終了することをお勧めします。これにより、後で新しいケースを追加する場合に、前のケースに休憩を追加することを忘れないでください。

于 2012-04-22T17:40:05.967 に答える
0

理解できるかどうかはわかりませんが、コードsendMessagesは実際には順序なしで「起動」します。したがって、特に、各ifステートメントを実行し、関連するメッセージを起動してから、これらのメッセージやその他の場所で何が起こっても、これに到達handler.sendMessage(endmessage); してjustzもこれを起動します。

ここで、endMsgをいつ送信するかを正確にチェックする「ゲートキーパー」が表示されます。

これはあなたの質問ですか?

于 2012-04-22T17:38:42.067 に答える