그림 목록의 그림을 전환하기위한 작업자 스레드를 만드는 활동이 있습니다. 예, 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는 스레드를 일시 중지하지 않습니다. 이것은 수수께끼이다.
업데이트 : 전체 작업자 스레드를 가져 와서 해당 작업이 호출하는 별도의 로컬 서비스에 넣었습니다. 작업자 스레드는 여전히 몇 루프 후에 사라집니다. 그게 미친 짓이야 --- 작업자 스레드는 서비스에 대한 일반적인 용도입니다. 비린내 같은 일이 벌어지고 있지만 ... 나는 아직도 그 사람이 무엇인지에 대한 단서를주는 사람을 고맙게 생각합니다.
이 경우 권장되는 것이 맞습니까? 우선, 스레드와 마찬가지로 AsyncTask가 빌드됩니다. 두 번째로, AsyncTasks는 스레드 풀에서 가져옵니다. --- 우리는 실제로 백그라운드 메서드가 몇 초마다 잠자기되고 기본적으로 영원히 지속되기를 원하면서 AsyncTask의 풀을 빼앗습니까? 마지막으로 스레드가 죽는 것을 어떻게 알 수 있습니까? 안드로이드가 스레드를 중단시키지 않고 로그에 아무 것도 제공하지 않고 단순히 스레드를 죽일 것이라는 것을 나타내는 문서를 어디서 찾을 수 있습니까? 그리고 AsyncTask가 이것을 어떻게 막을까요? –