2012-12-12 2 views
-1

제목이 문제를 거의 설명합니다.완료된 스레드를 다시 시작하면 크래시가 발생합니다 (Android SDK)

나는이 스레드를 켜기/끄기 버튼을 누르면 버튼이 있습니다. 그것을 성공적으로 켜고 끕니다 ... 한 번 켜면 다시 켤 때 충돌합니다.

private Thread dataThread = new Thread(new Runnable(){ 
    public void run() { 
     while(transmitPackets){ 
       Log.d("Test","DERP"); 
     } 
    } 
}); 

어디 그것의 실행 ...

toggleButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v){ 
      transmitPackets = !transmitPackets; 
      if(transmitPackets) { 
       toggleButton.setText("Pause"); 
       dataThread.start(); 
      } 
      else { 
       toggleButton.setText("Transmit"); 
      } 
     } 
    }); 

에서는 TransmitPackets는 버튼을 눌러 토글 부울입니다. 이 앱은 결국 네트워크를 통해 데이터를 전송하기 때문에 이름이 붙여졌습니다. 스레드는이를 사용하여 종료합니다.

애플 리케이션 크래시에 의해 생성 된 스택 추적은 스레드를 다시 시작할 때 충돌이 발생한다는 것을 말하면서 문제를 스스로 해결하는 방법을 찾는 데 특히 도움이되지 않습니다.

저는 안드로이드 SDK와 자바 모두에 대한 글을 쓰고있어서 어디서 잘못 될 수 있는지 모릅니다. 이것은 가능한 스레드의 가장 단순한 구현 인 것 같습니다. 스레드와 함께 펑키 한 것을 시도하기 전에 시작하는 부분입니다.

답변

1

하나의 스레드 만 만들면 DataThread 코드를 setOnClickListener 코드로 옮겨야하므로 다시 시작할 때와 마찬가지로 할 수 없습니다.당신은 당신이 지금 DataThread를 선언하지만, 청취자

2

성공적으로 켜고 끕니다 ... 한 번 켜면 다시 켤 때 충돌이 발생합니다.

실제로. 이미 끝난 스레드는 시작할 수 없습니다. 새 스레드를 만들어야합니다.

  • 스택 추적
  • documentation :

    이미 시작되었습니다 스레드를 다시 시작할 수있는 정보는에서 당신에게 명확해야한다는

    스레드를 시작한 경우 IllegalThreadStateException을 던집니다.

예외가 발생하면 항상 예외 메시지 (거기에 인과 관계 정보가있을 수 있으므로 스택 추적)와 설명서를주의 깊게 읽어야합니다.

+0

모든 대답은 여기있어, 고마워! 난 그냥 스레드가 OnClickListener에서 만들어지고 아름답게 작동하고있어. 그게 무슨 가치가 있는지, 그 예외는 충돌이 생성 된 스택 추적에 없습니다. 나는 어느 쪽이든 도움을 주셔서 감사합니다. – Wuzseen

+2

@Wuzseen : 스택 트레이스는 어떻게 생겼습니까? 한 걸음 물러나서 스스로 진단 할 수없는 이유를 분석해야합니다. 스택 추적은 "특별히 도움이되지 않습니다"라고 말하지만 실제로 질문에 복사 한 경우 도움이 될 수있는 방법을 알 수있었습니다. –

2

일단 스레드가 완료되면 사라집니다. 다시 시작할 수 없습니다. 새 스레드를 만들어야 할 수도 있습니다. 스택 추적이 없으면 아무 것도 제안하기가 어렵습니다.

스레드에서 start()을 호출한다고해서 스레드를 다시 시작한다는 의미는 아닙니다. 즉, 새로운 스레드를 시작한다는 의미입니다.

문제가 다른 것일 수 있습니다. 게시 스택 추적.

0

에서 설정 더 나은 구현이 스레드가가는 계속 그런 식으로

private Thread dataThread = new Thread(new Runnable(){ 
public void run() { 
    while(true){ 

    if(transmitPackets){ 
     Log.d("Test","DERP"); 
     transmitPackets = false; 
    } 
    } 
} 
}); 

것, 그리고 당신이 모두에서는 TransmitPackets의 변화 진리 값 입니다한다 가치 그래서 그것을 실행합니다

+0

다음을 위해 새 스레드를 만들어야합니다. 이 dataThread Thread를 잡아두면 GUI 스레드에서 실행되지 않습니다. 나는 새로운 클래스를 제안하고, 그런 식으로 메소드 transmitData()를 호출 할 수있다. 클래스는 transmitPackets를 true로 설정한다. – dannyRods

+0

이것은 또한 앱이 실행되는 동안 화면이 꺼져 있거나'transmitPackets'을 거짓으로 가지고 있습니다; CPU 사용량도 줄어 듭니다. 비어있는 회전 루프는 사이클을 계속 먹습니다. –

+0

은 AsyncTask를 설명하기보다는 sdk를 처음 사용하기 때문에 설명하기가 더 쉬워 보였습니다. – dannyRods

관련 문제