我确定我在这里做了些蠢事,但是代码如下:
...
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。我做错了什么?
答案 0 :(得分: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
中,您可以在switch
what
上extractHandler.sendMessage(m);
,以便将来添加新的邮件类型。我想你也应该使用:
extractHandler.dispatchMessage(m);
而不是
{{1}}
不确定是否有任何问题可以解决您的问题!
答案 1 :(得分:1)
是的,这是愚蠢的。我应该使用extractHandler.sendMessage(m);
代替extractHandler.dispatchMessage(m);