2011-11-22 6 views
1

그림 목록의 그림을 전환하기위한 작업자 스레드를 만드는 활동이 있습니다. 예, onPause()/onResume() 작업자 스레드를 시작하고 중지합니다.Android 미스터리 : 스레드가 사라 집니까?

public void run() 
    { 
     while(transitionWorkerThread == this) 
     { 
      try 
      { 
       Log.d(getLogTag(), "Ready to sleep."); 
       Thread.sleep(5000); 
       Log.d(getLogTag(), "ready to transition, is running? " + (transitionWorkerThread == this)); 
       if(transitionWorkerThread == this) 
       { 
        Log.d(getLogTag(), "ready to post image change"); 
        MAIN_THREAD_HANDLER.post(new Runnable() 
          { 
           @Override 
           public void run() 
           { 
            Log.d(getLogTag(), "ready to go to next image"); 
            imageSlideView.goNextImage(); 
            Log.d(getLogTag(), "supposedly went to next image"); 
           } 
          }); 
        Log.d(getLogTag(), "posted image change, is running? " + (transitionWorkerThread == this)); 
       } 
      } 
      catch(final InterruptedException interruptedException) 
      { 
       Log.d(getLogTag(), "Worker interrupted."); 
      } 
      catch(final Throwable throwable) 
      { 
       Log.d(getLogTag(), "some sort of picture error?", throwable); 
      } 
     } 
     Log.d(getLogTag(), "dropped out of picture loop, worker: " + transitionWorkerThread + " is us? " + (transitionWorkerThread == this)); 
    } 

지금 여기에 신비의 : 스레드가 사라 작업자의 고기 건너 뛰기, 나는 그것이 중단 될 때 종료 및 주요 변수가 널 (null) (또는 다른 근로자)로 설정되어 루프를 가지고! 잠시 후에 실행을 멈 춥니 다! 진심으로! 이 로그 출력 봐 :

11-22 13:13:40.186: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:13:40.191: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:40.191: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:45.253: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:13:45.253: D/PictureFrameActivity(941): ready to post image change 
11-22 13:13:45.253: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:13:45.253: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:13:45.253: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:45.253: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:50.272: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:13:50.272: D/PictureFrameActivity(941): ready to post image change 
11-22 13:13:50.272: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:50.272: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:50.301: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:13:50.301: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:13:55.325: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:13:55.325: D/PictureFrameActivity(941): ready to post image change 
11-22 13:13:55.325: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:55.325: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:55.331: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:13:55.331: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:14:00.011: E/dalvikvm(76): No free temp registers 
11-22 13:14:00.011: E/dalvikvm(76): Jit: aborting trace compilation, reverting to interpreter 
11-22 13:14:00.365: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:14:00.365: D/PictureFrameActivity(941): ready to post image change 
11-22 13:14:00.365: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:14:00.365: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:14:00.371: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:14:06.042: D/dalvikvm(941): GC_CONCURRENT freed 2106K, 58% free 3260K/7751K, external 13519K/13938K, paused 15ms+10ms 
11-22 13:14:06.541: I/dalvikvm(941): Jit: resizing JitTable from 1024 to 2048 
11-22 13:14:11.111: D/dalvikvm(941): GC_CONCURRENT freed 2051K, 57% free 3342K/7751K, external 13519K/13938K, paused 19ms+17ms 
11-22 13:14:15.121: D/dalvikvm(941): GC_CONCURRENT freed 2174K, 59% free 3216K/7815K, external 13519K/13938K, paused 20ms+20ms 
11-22 13:14:19.271: D/dalvikvm(941): GC_CONCURRENT freed 2028K, 59% free 3235K/7815K, external 13519K/13938K, paused 24ms+21ms 

당신이 지난 후에 알 수 있습니다 "? 게시 된 이미지 변화, 진정한 실행", 스레드는 사라지고 다시는 들어 본 적이있다! 코드를 살펴보면 몇 가지 선택 사항 만 있습니다. "작업자가 중단되었습니다"또는 "일종의 그림 오류"또는 "그림 루프가 끊어졌습니다"를 볼 수 있습니다. 모든 것이 정상적으로 진행되면 다시 돌아와서 "잠자기 준비 완료"라고 말합니다.

하지만이 스레드에서 다른 것을 볼 수 없습니다! 마치 루프의 끝에서 중지 된 것처럼 보입니다. 확실히 Android는 스레드를 일시 중지하지 않습니다. 이것은 수수께끼이다.

업데이트 : 전체 작업자 스레드를 가져 와서 해당 작업이 호출하는 별도의 로컬 서비스에 넣었습니다. 작업자 스레드는 여전히 몇 루프 후에 사라집니다. 그게 미친 짓이야 --- 작업자 스레드는 서비스에 대한 일반적인 용도입니다. 비린내 같은 일이 벌어지고 있지만 ... 나는 아직도 그 사람이 무엇인지에 대한 단서를주는 사람을 고맙게 생각합니다.

답변

0

유레카! 이것은 스레드 문제가 전혀 아닙니다. 이것은 내 잘못 (깜짝!).

원래 코드에 대해 완전히 진실이 아니 었습니다. 실제로이 모습 :

final long sleepLength = transitionIntervalManager.pollState(); 
try 
{ 
    Log.d(getLogTag(), "Ready to sleep for "+sleepLength); 
    Thread.sleep(sleepLength); 

transitionIntervalManager 내가 실제로 시간이 지남에 따라 아래로 전환을 늦추기 위해 작성한 멋진 클래스입니다. 나는 버그가있어 마지막 (가장 느린) 전환 시간에 도달했을 때 pollState을 호출하면 무한 루프가되어 결코 되돌아 가지 않을 것이다. 이 메서드는 첫 번째 로그보다 먼저 호출 되었기 때문에 로그는 기록되지 않을 것입니다. 그리고 내 스레드는 계속 다음 변환을 시도하려고합니다. (내 노트북 ​​팬이 온 것도 당연하지!)

나는 코드를 단순화하려고 노력했다. 문제를 단순화시키는 것을 깨닫지 못했다. 내 말은, 어떻게 그런 간단한 코드에 버그가있을 수 있는지. ;)

0

왜 스레드가 죽지는 모르겠지만 내 생각에 활동 라이프 사이클과 관련이 있습니다. 이제 안드로이드에는 쉬운 스레딩을 허용하고 코드처럼 UI 스레드에 주기적으로 게시물을 게시하는 좋은 클래스가 있습니다. AsyncTask을보고 publishProgress 함수를 사용하여 UI 개체를 업데이트하십시오. 다시 나는 당신의 코드에 무엇이 문제인지 모르지만 안드로이드 쓰레딩을위한 최선의 방법은이 클래스를 사용하는 것이다.

+0

이 경우 권장되는 것이 맞습니까? 우선, 스레드와 마찬가지로 AsyncTask가 빌드됩니다. 두 번째로, AsyncTasks는 스레드 풀에서 가져옵니다. --- 우리는 실제로 백그라운드 메서드가 몇 초마다 잠자기되고 기본적으로 영원히 지속되기를 원하면서 AsyncTask의 풀을 빼앗습니까? 마지막으로 스레드가 죽는 것을 어떻게 알 수 있습니까? 안드로이드가 스레드를 중단시키지 않고 로그에 아무 것도 제공하지 않고 단순히 스레드를 죽일 것이라는 것을 나타내는 문서를 어디서 찾을 수 있습니까? 그리고 AsyncTask가 이것을 어떻게 막을까요? –

관련 문제