2016-04-23 8 views
0

Im Versuch, ein Programm zu machen, dass, wenn ich eine Taste drücken, wird es die Geschwindigkeit meines Arduino Auto zeigen und die zurückgelegte Strecke. Ich versuche, die Entfernung in TextView ständig zu aktualisieren.Android Studio Threads Handler

Hier meine Initialisierung von Handler ist in der onCreate(), die meine Textview Text distanzieren setzen soll hier

mHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      Bundle bundle = msg.getData(); 
      String stringss = bundle.getString("myKey"); 
      tv2 = (TextView) findViewById(R.id.zval); 
      tv2.setText("Distance is : " + stringss); 
     } 
    }; 

Und ist mein Thread, der die Arbeit im Hintergrund tut

btnDist.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Runnable runnable = new Runnable() { 
       public void run() { 
        Message msg = mHandler.obtainMessage(); 
        Bundle bundle = new Bundle(); 
        int distance = distanta(); //function that returns distance/secound 
        int dist = 0; 
        while(distance > 0) { 
         try { 
          Thread.sleep(1000);     //1000 milliseconds is one second. 
         } catch (InterruptedException ex) { 
          Thread.currentThread().interrupt(); 
         } 

         dist += distance; 
        } 
         String dateString = String.valueOf(dist); 
         msg(dateString); 
         bundle.putString("myKey", dateString); 
         msg.setData(bundle); 
         mHandler.sendMessage(msg); 

       } 
      }; 
      Thread mythread = new Thread(runnable); 
      mythread.start(); 
     } 
    }); 

Die Anwendung läuft und stürzt nicht ab, aber meine Textansicht wird überhaupt nicht aktualisiert. Ich bin neu in Java-Threads, so dass ich etwas falsch gemacht haben könnte. Vielen Dank!

Antwort

0

diese versuchen, die Zeit des Arduino zu finden gereist:

TextView TimerBox; 
long startTime = 0; 

Handler timerHandler = new Handler(); 

//this updates the textbox 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 
     long millis = System.currentTimeMillis() - startTime; 
     int seconds = (int) (millis/1000); 
     int decis = (int) ((millis % 1000)/10); 

     TimerBox.setText(String.format("Time: %d.%02d", seconds, decis)); 
     timerHandler.postDelayed(this, 10); 
    } 
}; 

Dieses neue Handler mit einer bestimmten Funktion initialisiert, die den Timer Textview aktualisiert.

Wenn Sie es ausführen möchten, Code dies:

startTime = System.currentTimeMillis(); 

timerHandler.postDelayed(timerRunnable, 0); 

und wenn Sie es wollen, dies zu stoppen, benutzen Sie:

timerHandler.removeCallbacks(timerRunnable); 

diese Lösung benötigen Sie die zurückgelegte Strecke selbst zu berechnen basierend auf Geschwindigkeit und Beschleunigung.

+0

Das war sehr hilfreich, danke für die Antwort. –

0

Der Grund, warum es nicht funktioniert, weil Handler den Nachrichten-Handler auf dem Thread ausgeführt wird, auf dem es wird standardmäßig erstellt. In Ihrem Beispiel ist dies der Thread mythread. Das bedeutet, dass Sie versuchen, die Benutzeroberfläche von einem anderen Thread als dem UI-Thread zu aktualisieren, der normalerweise nicht funktioniert.

Es kann die Looper durch die Angabe, auf dem festgelegt werden die Handler sollte, wie mHandler = new Handler(Looper.getMainLooper()) {

+0

Es dosn't Arbeit, die Abstandsgröße des aktuellen Abstand hinzufügen soll, und der Wert behalten soll, solange das Auto in Bewegung bleibt auf erhöht wird. Ich habe einen Timer und vielfache die Geschwindigkeit des Autos mit der Zeit, um die Entfernung zu erreichen. Danke für deine Antwort und für deine Zeit! –

0

im sorry, das ist ein Missverständnis führen. das ist nicht mein Code, mein einziger Code ist nur dieser

if(seconds == 2){ 
seconds = 0; 
decis = 0; 
} 

i kippe gerade Kommentar auf Chi-Young Jeffrey Lü Antwort, weil mein rep ist nicht genug, ich will nur wissen, wie die Sekunden Variable

lesen
+0

sein gibt keine Antwort auf die Frage. Sobald Sie ausreichend [Ruf] haben (http://stackoverflow.com/help/whats-reputation) können Sie auf [Kommentar] (http://stackoverflow.com/help/privileges/comment) auf jedem Posten. Überprüfen Sie auch das [was kann ich tun, anstatt] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere