在我的应用程序中,我有一个按钮,当它被点击时,我开始一个新的线程并更改按钮的文本。如果我再次按下按钮,它将开始更快地更改文本。
我想在第二次按下按钮时中断线程。有什么正确的方法吗?
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread() {
new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText("#" + i);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
答案 0 :(得分:3)
在这种情况下,只需保留对线程的引用并使用Thread.interrupt():
private Thread runThread() {
return new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText("#" + i);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
然后:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (myThread != null) myThread.interrupt();
myThread = runThread();
myThread.start();
}
});
阅读这篇文章了解更多信息和选项:
答案 1 :(得分:2)
在我看来,最好的方法是使用变量来控制它。
类似的东西:
while(i++ < 1000 && keepRunning)
我认为这是一个很好的解决方案,因为它无法导致意外行为,因为您确定线程将退出的确切时刻。
额外 -
作为建议,我还建议你设置你的线程非Damon(setDaemon(false)),因为它会进行布局更改
同样最好给线程命名(setName())以便于调试。
答案 2 :(得分:1)
现在每次按下按钮都会启动一个新的线程。
这样的事情应该有效。
public class TestActivity extends Activity {
Button btn;
int i = 0;
Thread countThread = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
countThread = new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText("#" + i);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread() {
if(countThread != null) {
if(countThread.isAlive()) {
countThread.stop();
} else {
countThread.start();
}
}
}
我只有一个文本编辑器,所以我无法保证这是否能解决您的问题。
答案 3 :(得分:1)
您可以使用thread.interrupt()
到interrupt主题。
答案 4 :(得分:0)
试试这个,只需要另外一个变量j,它将处理你的代码: -
public class TestActivity extends Activity {
Button btn;
int i = 0,j=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
j=1;
runThread();
}
});
}
private void runThread() {
new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(j==1){
btn.setText("#" + i);
j=0;
}
else
Thread.interrupted();
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
答案 5 :(得分:0)
您可以在Android中使用普通Thread(并为您的用例调用interrupt()
),但框架通过提供围绕线程的帮助程序类提供了其他更好的选项。您可以参考官方documentation页面了解其他选项。
HandlerThread是首选方案。如果您选择HandlerThread
相关文章: