我正在模拟相机输入并且有一个通过无限循环图像的按钮。 它在单击按钮时启动,当单击按钮时,它应该停止线程,直到再次单击该按钮。
现在它启动并循环正常,但是当我再次单击它时崩溃
点击
public void onClick(View v) {
switch(v.getId()){
case R.id.cam1btn:{
if(thread1 == null){
thread1 = new Thread(){
public void run(){
Cam1();
}
};
thread1.start();
}
else
{
thread1.stop();
thread1=(null);
}
}
break;
Cam1功能
protected void Cam1() {
int i=0;
do{
System.out.println("got into loop");
for(int x=0;x<4;x++){
//imgFeed1.setImageAlpha(camFeed1[x]);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final int temp = x;
mCam1Handler.post(new Runnable(){
public void run(){
imgFeed1.setImageResource(camFeed1[temp]);
}
});
}
}while(i == 0);
}
logcat的
答案 0 :(得分:0)
一般情况下,你不应该强行停止线程。线程必须通过完成其任务来停止。
在您的情况下,您需要在实例范围中定义i = 0
并在用户单击停止按钮时将其设置为某个值,并且while循环结束并且线程完成其任务。
我建议您保留boolean
标志而不是int
。
<强>更新强>
好的,那么当你点击按钮toRun = false
时,你应该有一个标志并且首次切换前toRun = !toRun;
。while(toRun) {
//repeat your task
}
。在您的运行方法中,应该有{{1}}
答案 1 :(得分:0)
只是为了帮助你理解Rp-答案:
首先在toRun
之外声明布尔thread
,因为它是一个由两个线程(UI和您创建的)访问的变量,您必须使用&#39; synchornize`块来访问它并读取写下来。
boolean toRun = false;
public void onClick(View v) {
switch(v.getId()){
case R.id.cam1btn:{
boolean isThreadRunning;
synchronize(toRun){
isThreadRunning = toRun;
}
if(!isThreadRunning){
toRun =true; // here you do not need synchronize block because the thread has not been created.
thread1 = new Thread(){
public void run(){
Cam1();
}
};
thread1.start();
}
else
{
synchornize(toRun){
toRun = false;
}
}
}
break;
并在你的cam1中:
protected void Cam1() {
boolean myRun;
do{
System.out.println("got into loop");
for(int x=0;x<4;x++){
//imgFeed1.setImageAlpha(camFeed1[x]);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final int temp = x;
mCam1Handler.post(new Runnable(){
public void run(){
imgFeed1.setImageResource(camFeed1[temp]);
}
});
}
synchronize(toRun){
myRun = toRun;
}
}while(myRun);
}