2014-09-19 103 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

相關問題