2011-04-07 5 views
0

안드로이드에서 스레드 예외가 발생했습니다. 버튼을 클릭하면 동적으로 핸들러를 호출하는 스레드가 시작되고 핸들러는 정수 값을 갖는 텍스트 뷰를 업데이트하고 정수 10에 도달하면 핸들을 중지합니다. 스레드는 경고를 표시해야하고,하지만 난 아마도 오류가 counterThread.stop 던져Android Thread Exception?

public class sample extends Activity implements Runnable{ 

public Camcorder() 
    { 
     try{ 
     counterThread = new Thread(this); 
     }catch(Exception ee) 
     { 

     } 
    } 

    public void run() 
    { 
     try{ 
     while(counterFlag) 
     { 

      System.out.println("The time starts at : "+counter); 

      Thread.sleep(1000); 
      calculate(counter); 
      counter++; 
     } 
     }catch(Exception ee){ 
      System.out.println("Err in ee : "+ee); 
     } 
    } 
     @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      c=this.getApplicationContext(); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      setContentView(R.layout.main); 
         authalert3 = new AlertDialog.Builder(this); 
       authalert3.setTitle("Save Video"); 
       authalert3.setMessage("Do you want to save this Video?"); 
       authalert3.setPositiveButton("Yes", null); 
       Button test = (Button) findViewById(R.id.widget33); 

      test.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
       counter = 0; 
       counterFlag = true; 
       counterThread.start(); 

       } 


}); 

public void calculate(int counter2) { 
     // TODO Auto-generated method stub 

    if(counter2<60){ 
     if(counter2<10) 
     { 
      smin="0"+counter2; 
     } 
     else{ 
      smin=""+counter2; 
     } 
    } 
    else{ 
     hours++; 

     counter=0; 
     smin="00"; 
     if(hours<10){ 
      shours="0"+hours; 
     } 
     else{ 
      shours=""+hours; 
     } 
    } 
     handler.sendEmptyMessage(0); 

    } 


Handler handler = new Handler(){ 
     public void handleMessage(android.os.Message msg) { 
      String tes=shours+":"+smin; 




      time.setText(tes); 
      test(); 
     }; 
    }; 


public void test(){ 
duration=1; 
     if(duration==hours){ 
      counterFlag = false; 
      videoPath=camcorderView.stopRecording(); 
      authalert3.create().show(); 
      counterThread.stop(); 

     } 


    } 

() 아래에 표시되어 무엇을하고 오류를 일으킬 것이다;

누구나이 오류를 해결하는 방법을 제안합니다.

+0

오류의 예외 및 디버그 출력을 붙여 넣어야합니다. –

답변

1

counterThread.stop을 호출하여 스레드를 중지하지 마십시오. 이 메소드는 더 이상 사용되지 않습니다. 귀하의 경우, counterFlag = false; 설정하여 스레드가 자체를 중지해야합니다.

버튼을 두 번 클릭하면 예외가 발생합니다. 이미 시작된 스레드에서 start를 호출 할 수 없습니다. 해당 스레드의 새 인스턴스를 만들고 해당 새 인스턴스를 시작해야합니다 (필요한 경우 이전 인스턴스를 중지해야합니다).

SO가 스레드 작성/중지 방법에 대한 몇 가지 샘플 코드에 대해 대답하는 것을 볼 수 있습니다 : Android thread in service issue. Java Threads에 대한 튜토리얼 (안드로이드에만 국한되지는 않음)을 읽는 것도 좋습니다.

private static final int MSG_REFRESH_UI = 0; 
private static final int MSG_UPDATE_COUNTER = 1; 

private int counter = 0; 

Handler handler = new Handler(){ 
    public void handleMessage(android.os.Message msg) { 
     if (msg.what==MSG_REFRESH_UI) { 
      String tes=shours+":"+smin; 
      time.setText(tes); 
      test(); 
     } else if (msg.what==MSG_UPDATE_COUNTER) { 
      counter++; 
      if (counter<10) { 
       calculate(counter); 
       handler.sendEmptyMessageDelayed(MSG_UPDATE_COUNTER, 1000); 
       handler.sendEmptyMessage(MSG_REFRESH_UI); 
      } 
     } 
    }; 
}; 

public void onResume() { 
    handler.sendEmptyMessage(MSG_UPDATE_COUNTER); 
} 

public void calculate(int counter2) {  
    if (counter2<10) { 
     smin = "0"+counter2; 
    } else if (counter2<60) { 
     smin = ""+counter2; 
    } else{ 
     hours++; 

     counter=0; 
     smin="00"; 
     if(hours<10){ 
      shours="0"+hours; 
     } else { 
      shours=""+hours; 
     } 
    } 
} 
0

이 중지됩니다


은 또한 당신이 전혀, 당신은 복잡한 아무것도 없습니다 스레드를 필요로하지 않으며, 따라서 당신은 단순히 모든 작업을 수행 할 핸들러를 사용할 수 있다고 생각 thread at 10

while(counterFlag) 
     { 

      System.out.println("The time starts at : "+counter); 

      Thread.sleep(1000); 
      calculate(counter); 
      counter++; 

      if(counter == 10) counterFlag = false; 
     }