按下按钮时启动无限循环线程,再次按下时停止

时间:2014-09-19 00:47:49

标签: java android multithreading

我正在模拟相机输入并且有一个通过无限循环图像的按钮。 它在单击按钮时启动,当单击按钮时,它应该停止线程,直到再次单击该按钮。

现在它启动并循环正常,但是当我再次单击它时崩溃

点击

    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的

logcat

2 个答案:

答案 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);

}