Проблема с обработчиком Android - PullRequest
0 голосов
/ 07 января 2011

Я уверен, что я делаю что-то глупое здесь, но следующий код:

...

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 Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Код, который вы разместили в вашем 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 голос
/ 07 января 2011

Да, это было что-то глупое.Я должен был использовать extractHandler.sendMessage(m); вместо extractHandler.dispatchMessage(m);

...