2011-01-07 3 views
0

내가 여기 멍청한 짓을하고 있어요 확신하지만, 다음 코드안드로이드 처리기 문제

... 

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

여전히 이것이 사실에도 불구하고, 라인 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() 

을 받고있다 내 메인 스레드에서 내부 처리기 내에서 호출 handleMessage. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

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에서 whatswitch을 입력하면 이후에 새 메시지 유형을 추가 할 수 있습니다. 난 당신이 또한 사용해야한다고 생각 :

extractHandler.sendMessage(m); 

오히려

extractHandler.dispatchMessage(m); 

그 중 하나가 문제를하지만 해결되는 확실하지

보다!

+0

고맙고, 매우 유용한 조언이며, 문제였던'dispatchMessage()'를 사용했습니다. – fredley

1

네, 어리석은 짓이었습니다. 내가 extractHandler.dispatchMessage(m); 대신 extractHandler.sendMessage(m);을 사용해야했습니다

+1

차이점은 무엇입니까? – waqaslam