2011-01-07 92 views
0

我知道我在做一些愚蠢的事在這裏,但下面的代碼:Android的處理程序問題

... 

public void onClick(View v) { 
    extractThread et = new extractThread(); 
    et.start(); 
} 

... 

private class extractThread extends Thread{ 

    public void run(){ 
    expensiveOperation(); 

    Message m = new Message(); 
    Bundle b = new Bundle(); 
    b.putString("message","result"); 
    m.setData(b); 
    extractHandler.dispatchMessage(m); 
    } 
} 

private Handler extractHandler = new Handler(){ 

    public void handleMessage(Message m){ 

    Bundle b = m.getData(); 
    String message = b.getString("message"); 

    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setMessage(message) 
     .setCancelable(false) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.cancel(); 
       } 
    }); 
    builder.create().show(); 
    } 
}; 

卻依然向

01-07 11:55:02.791: ERROR/AndroidRuntime(18791): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

在該行builder.create().show();,儘管這是在handleMessage的主線程中調用Handler。我究竟做錯了什麼?

回答

2

是你發佈你的Activity類中的代碼?

我也將使用

Message msg = Message.obtain(); 

,而不是創建一個新的消息。此外,如果你只是想傳遞一個String,則:

private static final int HANDLER_MESSAGE_RESULT = 0; 
... 
msg.what = HANDLER_MESSAGE_RESULT; 
msg.obj = "result"; 

比傳遞Bundle更有效。在您的Handler中,您可以在what上使用switch,這允許您在將來添加新的消息類型。我想你也應該使用:

extractHandler.sendMessage(m); 

而不是

extractHandler.dispatchMessage(m); 

不知道任何的是,雖然解決您的問題!

+0

謝謝,非常有幫助的建議,它是使用`dispatchMessage()`這是問題。 – fredley 2011-01-07 12:36:39

1

是的,這是愚蠢的。我應該使用的extractHandler.sendMessage(m);代替extractHandler.dispatchMessage(m);

+1

最新的區別是什麼? – waqaslam 2012-04-19 11:45:50