2011-01-07 4 views
0

Ich bin sicher, ich bin etwas Dummes hier zu tun, aber der folgende Code:Android Handler Problem

... 

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

noch immer

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

an der Linie builder.create().show();, trotz der Tatsache, das ist in einem Handler in meinem Haupt-Thread innerhalb handleMessage aufgerufen. Was mache ich falsch?

Antwort

2

verwenden sollen Ist der Code, den Sie innerhalb Ihrer Activity Klasse bekanntgegeben?

Ich würde auch

Message msg = Message.obtain(); 

verwenden, anstatt eine neue Nachricht zu erstellen. Auch wenn Sie nur ein String dann passieren soll:

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

ist effizienter als die Übergabe eines Bundle. In Ihrem Handler können Sie dann switch auf dem what, mit dem Sie neue Nachrichtentypen in der Zukunft hinzufügen können. Ich denke, Sie sollten auch werden:

extractHandler.sendMessage(m); 

statt

extractHandler.dispatchMessage(m); 

Nicht sicher, dass irgendetwas davon behebt das Problem aber!

+0

Danke, sehr hilfreicher Rat und es war die Verwendung von 'dispatchMessage()', das war das Problem. – fredley

1

Ja, es war etwas dummes. Ich hätte extractHandler.sendMessage(m); anstelle von extractHandler.dispatchMessage(m);

+1

Was ist der Unterschied? – waqaslam