我有我的主線程正在創建新線程的實例。這個新線程創建了一個節拍器的實例。如果我嘗試通過點擊主線程上的按鈕來調用節拍器play()方法,那麼節拍器開始,但整個應用程序凍結。從主線程凍結應用程序調用工作線程中的應用程序
主要活動代碼:
public class HomeScreen extends Activity {
MetroThread metronome;
/*** onCreate ***/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_screen);
metronome = new MetroThread();
metronome.start();
}
/*** button clicks ***/
public void st44BtnClick(View v)
{
if(metronome.myMetronome==null)
{
metronome.playMetronome();
}
else if(metronome.myMetronome!=null)
{
metronome.stopMetronome();
}
}
節拍器線程代碼:
public class MetroThread extends Thread
{
//create instance of the metronome
public Metro myMetronome;
public void run()
{
System.out.println("metroThread started");
}
/*** play metronome ***/
public void playMetronome()
{
myMetronome = new Metro();
myMetronome.bpm = 200;
myMetronome.beat = 7;
myMetronome.beatSound = 2000;
myMetronome.sound = 2600;
myMetronome.play();
}
/*** stop metronome ***/
public void stopMetronome()
{
myMetronome.stop();
myMetronome = null;
}
}
如果不是使用一個按鈕來調用playMetronome方法我可以簡單的調用方法從節拍器線程的run()中,它工作正常,並且不會鎖定應用程序。
在這種情況下,每次點擊按鈕啓動節拍器線程是否是最佳做法?我很擔心線程建立並繼續在後臺運行。 – user2145312
@ user2145312線程在退出運行時消失 - 因此沒有建立。創建線程有一些開銷,所以最好避免它。您還需要考慮如果有人多次重複按下按鈕會發生什麼情況。你應該調查'ExecutorService'。 –