2016-07-19 19 views
-1

Ich versuche ein Beispiel zu erstellen, um zu wissen, wie Handler arbeiten. Wie im Code belwo gezeigt, habe ich einen workerThread erstellt, der für immer läuft und die Variable i inkrementiert. Innerhalb der run() - Methode möchte ich den Wert der inkrementierten Variable an einen TextView übergeben, wie im Rumpf der Handler-Klasse gezeigt.sendMessage() ist nicht definiert

Das Problem ist, die Zeile, in der es "neue Handler()" und "handler.sendMessage (m)" mit roten

markiert ist, lassen Sie es mich wissen, wie dieses Problem zu lösen

MainActivity

public class MainActivity extends AppCompatActivity { 

private final static String TAG = MainActivity.class.getClass().getSimpleName(); 
private TextView mtvIncr = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    this.mtvIncr = (TextView) findViewById(R.id.tvValue); 
    new WorkerThread().start(); 
} 

Handler handler =new Handler() {//ERROR 
    @Override 
    public void handleMessage(Message msg) { 
     int sentInt = msg.getData().getInt("what"); 
     mtvIncr.setText("r:"+Integer.toString(sentInt)); 
    } 
}; 

class WorkerThread extends Thread { 

    private int i = 0; 
    android.os.Handler mHandler = null; 

    @Override 
    public void run() { 
     super.run(); 

     Looper.prepare(); 

     while(true) { 
      Log.d(TAG, SubTag.bullet("WorkerThread", "i: " + (i++))); 
      SystemClock.sleep(1000); 

      Message m = new Message(); 
      Bundle b = new Bundle(); 
      b.putInt("what", i); // for example 
      m.setData(b); 
      handler.sendMessage(m);//ERROR 
     } 
    } 
} 
} 
+1

Mögliche Duplikat [myHandler.obtainMessage() wird in Service-Klasse in Android nicht erlaubt] (http: // Stackoverflow .com/questions/36215126/myhandler-erhaltensmeldung-ist-nicht-erlaubt-in-service-klasse-in-android) –

+0

Ich glaube auch, es ist die gleiche Frage ... Wahrscheinlich, falscher Import. – W0rmH0le

Antwort

0

Verwenden Message.obtain() ein Message-Objekt erhalten

Während der Konstruktor der Nachricht public ist, ist der beste Weg, einen von zu erhalten, Message.obtain() oder eine der Handler.obtainMessage() -Methoden aufzurufen, die sie aus einem Pool von recycelten Objekten ziehen .

Und verwenden obj Attribut msg.obj = b;

obj: Ein beliebiges Objekt an den Empfänger zu senden.

Info ab:

https://developer.android.com/reference/android/os/Message.html

Beispiel:

Handler handler =new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     int sentInt = ((Bundle)msg.obj).getInt("what"); 
     mtvIncr.setText("r:"+Integer.toString(sentInt)); 
    } 
}; 


class WorkerThread extends Thread { 

    private int i = 0; 
    android.os.Handler mHandler = null; 

    @Override 
    public void run() { 
     super.run(); 

     Looper.prepare(); 

     while(true) { 
      Log.d(TAG, SubTag.bullet("WorkerThread", "i: " + (i++))); 
      SystemClock.sleep(1000); 

      Message msg = Message.obtain(); 
      Bundle b = new Bundle(); 
      b.putInt("what", i); // for example 
      msg.obj = b; 
      handler.sendMessage(msg); 
     } 
    } 
}