2014-09-19 105 views
1

我正在模拟摄像头并且有一个按钮会经过无限循环的图像。 它在点击按钮时开始,点击按钮时它应该停止线程,直到再次单击该按钮。按下按钮时启动无限循环线程,再按下时停止

现在它开始和循环很好,但是当我再次点击它,它崩溃上点击

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; 

段1功能

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的

logcat

+0

定义_crashes_ – Baby 2014-09-19 00:49:48

+0

说抱歉,但这个应用程序已停止工作 – user1314413 2014-09-19 00:52:09

+0

发布logcat的? – Baby 2014-09-19 00:55:03

回答

0

你不应该强行停止一般的线程。线程必须通过完成其任务来停止。

对于您的情况,您需要在实例范围中定义i = 0,并在用户单击停止按钮时将该值设置为某个值,while循环结束并且线程完成其任务。

我宁愿建议你维护一个boolean国旗而不是int

UPDATE 好吧,那么你应该有一个标志,并且切换是前:toRun = false首次,当用户点击你做toRun = !toRun;按钮。在您的run方法应该有一个while(toRun) { //repeat your task }

+0

没有停止按钮,只有一个按钮启动循环,当它再次点击时,线程应该停止,然后在再次点击之后再次启动等 – user1314413 2014-09-19 01:22:36

0

只是为了帮助你了解RP-答案:

首先声明布尔toRun以外的thread,因为它是由两个线程访问的变量(UI和您所创建的)您必须使用'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); 

} 
+0

任何问题,告诉? – mmlooloo 2014-09-19 04:01:48

+0

开始正常并循环播放,但是当我再次点击按钮时,它会继续循环到第一个图像并停止。当我再次点击按钮后,它什么也不做。 – user1314413 2014-09-19 04:27:30

+0

解释'它继续循环到第一个图像并停止.'更因为我不明白 – mmlooloo 2014-09-19 04:39:01

相关问题