2017-10-12 47 views
0

我有這樣一段代碼在MainACtivityonCreate方法:如何在啓動線程時更改按鈕的文本?

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

和baresipThread類看起來是這樣的:

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

} 

如果我刪除從代碼thread.start()/thread.kill()呼叫,文本按鈕每按一次就會切換。但是,如果包含線程調用,當按下按鈕時,按鈕的文本(最初爲Start)沒有變化。線程啓動正常。

爲什麼不改變文本以及如何使它發生?下面的代碼

+0

有你打過電話按鈕重繪更改文本後的方法? –

+0

看起來像按鈕對象沒有repaint()方法。另外,我的問題確實是,爲什麼在setText(「Stop」)之後調用thread.start()會導致setText(「Stop」)無效。 – Juha

+0

我會關閉這個問題並創建另一個問題。真正的問題是爲什麼調用一個永遠不會從Java線程終止的本地C函數會導致整個應用程序無法響應。 – Juha

回答

0

使用

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

感謝您使用更短的方式來調用setText()調用。不幸的是,這並沒有幫助解決問題。線程調用仍然無效setText調用的效果。如果我註釋掉線程調用,按鈕文本在每次按下時都會正常切換。 – Juha

+0

請分享您的baresipThread()代碼 –

+0

我只是將該代碼添加到原始問題中。它發現,這可能與線程無關,因爲如果我用直接調用本地方法baresip_start()來替換thread.start()調用,則會遇到同樣的問題。該本地方法永遠運行,除非用戶終止它。 – Juha

相關問題