2017-10-12 4 views
0

Ich habe dieses Stück Code in onCreate Methode der MainACtivity Klasse:Wie ändert man den Text der Schaltfläche beim Starten eines Threads?

setContentView(R.layout.activity_main); 

Button button1 = (Button)findViewById(R.id.button1); 
button1.setText("Start"); 

final baresipThread thread = new baresipThread(); 

button1.setOnClickListener(new View.OnClickListener() { 
    boolean running = false; 
    @Override 
    public void onClick(View v) { 
     if (!running) { 
      ((Button)v).setText("Stop"); 
      thread.start(); 
      running = true; 
     } else { 
      thread.kill(); 
      running = false; 
      ((Button)v).setText("Start"); 
     } 
    } 
}); 

und baresipThread Klasse sieht wie folgt aus:

package com.tutpro.baresip; 

public class baresipThread extends Thread { 

    public void run() { 
     baresip_start(); 
    } 

    public void kill() { 
     baresip_kill(); 
    } 

    public native void baresip_start(); 
    public native void baresip_kill(); 

} 

Wenn ich thread.start()/thread.kill() Anrufe aus dem Code, Text des entfernen Die Taste wechselt jedes Mal, wenn ich sie drücke. Aber wenn die Thread-Aufrufe enthalten sind, gibt es keine Änderung im Text (zunächst Start) der Schaltfläche, wenn ich es drücke. Der Thread wird gestartet.

Warum ändert sich der Text nicht und wie kann er umgesetzt werden?

+0

haben Sie versucht, nach dem Text ändern Tasten neu streichen Methode aufrufen? –

+0

Sieht so aus, als hätte das Schaltflächenobjekt keine repaint() -Methode. Meine Frage ist auch, warum bewirkt das Aufrufen von thread.start() nach setText ("Stop"), dass setText ("Stop") keine Wirkung hat. – Juha

+0

Ich werde diese Frage schließen und eine andere machen. Die eigentliche Frage ist, warum das Aufrufen einer nativen C-Funktion, die niemals mit dem Java-Thread endet, dazu führt, dass die gesamte Anwendung nicht mehr reagiert. – Juha

Antwort

0

Verwenden Sie den folgenden Code

final boolean running = false; 
    final baresipThread thread = new baresipThread(); 
    button1.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if (!running) { 
      ((Button)v).setText("Stop"); 
      thread.start(); 
      running = true; 
     } else { 
      thread.kill(); 
      running = false; 
      ((Button)v).setText("Start"); 
     } 
    } 
}); 
+0

Danke, dass Sie eine kürzere Methode zum Aufrufen von setText() - Aufrufen anzeigen können. Leider hat es mit dem Problem nicht geholfen. Die Threadaufrufe heben den Effekt der setText-Aufrufe noch auf. Wenn ich die Thread-Aufrufe auskommentiere, ändert sich der Button-Text bei jedem Drücken gut. – Juha

+0

Bitte teilen Sie Ihren baresipThread() Code auch –

+0

Ich habe diesen Code zur ursprünglichen Frage hinzugefügt. Es stellt fest, dass dies nichts mit Threads zu tun hat, da ich das gleiche Problem habe, wenn ich den Aufruf thread.start() durch direkten Aufruf der nativen Methode baresip_start() ersetze. Diese native Methode wird für immer ausgeführt, wenn der Benutzer sie nicht beendet. – Juha

Verwandte Themen