我需要在我的应用程序中多次调用同一个线程。使用我的原始代码,第一次可以很好地执行。但是第二次它崩溃了 - 然后我了解到每个线程只能执行一次。
我的原始代码:
View.OnClickListener myClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
mythread.start();
}
};
Thread mythread = new Thread(){
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Running...");
}
});
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Finished...");
}
});
}
};
正如我所说,如果我尝试第二次运行它,它就会崩溃。所以我试着修改它:
View.OnClickListener myClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
test();
}
};
private void test(){
Thread mythread = new Thread(){
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Running...");
}
});
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Finished...");
}
});
}
};
mythread.start();
}
效果很好;但我的问题是,这是否是执行此操作的正确方法,或者是否有更优化的方法来执行此操作?
此外,从另一个线程的内部调用一个线程是否可以接受? (就像我把东西放在我的新线程中的 UI 线程上的方式)
编辑: 这只是一个例子。对于我的实际代码,我需要完成大量基于数学的模拟,这需要 10 秒才能完成。根据将显示给用户的结果,他们可能想要更改输入参数并让模拟再次运行。这将发生多次。
最佳答案
除了关于使用 AsyncTask 或 runOnUiThread() 的其他好答案之外,您还可以将私有(private)成员定义为 Runnable,如下所示:
private Runnable mytask = new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Running...");
}
});
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Finished...");
}
});
}
};
然后,无论什么时候你想运行它,做
new Thread(mytask).start();
关于java - Java Android 多次启动/调用同一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359813/