2012-04-22 1 views
-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は、操作が完了する前に送信され、ProcessDialogは0.5秒のようで閉じることです。 Booleanがすべてtrueの場合、msg1, msg2, msg3, emdmsgがすぐにSystem.outに表示され、終了します。なぜこの動作?どうすれば修正できますか?

答えて

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; 
    } 

最後のブレークが厳密に必要としていますが、後で新しいケースを追加した場合、あなたが休憩を追加するために覚えておく必要がないように、それは、常にブレークでそれらを終了するには良い習慣だされていません前のケース。

0

私は理解していませんが、あなたのコードはちょうど "火災" sendMessages本当に何の順序もなし。つまり、それぞれの文章を実行し、関連付けられたメッセージを起動し、その後、これらのメッセージやその他の場所で何が起きても、handler.sendMessage(endmessage); に達し、justzもこれを実行します。

ここでは、あなたのendMsgを送信するタイミングを確認する「ゲートキーパー」があります。

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