Android Handler问题

时间:2011-01-07 12:04:03

标签: android multithreading handler

我确定我在这里做了些蠢事,但是代码如下:

...

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 个答案:

答案 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 whatextractHandler.sendMessage(m); ,以便将来添加新的邮件类型。我想你也应该使用:

extractHandler.dispatchMessage(m);

而不是

{{1}}

不确定是否有任何问题可以解决您的问题!

答案 1 :(得分:1)

是的,这是愚蠢的。我应该使用extractHandler.sendMessage(m);代替extractHandler.dispatchMessage(m);