내 응용 프로그램은 실행 프로그램을 사용하여 작업을 수행하는 스레드를 만듭니다.Android 스레딩 - 다른 스레드에서 스레드를 실행하고 처리기 메시지를 기다리는 중
필요한 경우 주 스레드에 비트 맵을로드하고 반환하는 스레드가 있습니다.
비트 맵을 로컬에서 찾을 수없는 경우 다른 스레드를 사용하여 파일을 다운로드합니다.
모든 스레드가 핸들러이 (가 핸들러에 메시지를 전송하여 다른 스레드 얘기 할 필요가 경우) 스레드에서 생성 될 수 있도록하기 위해 루퍼를 만들
public class LooperThread extends Thread
{
@Override
public void run()
{
Looper.prepare();
super.run();
Looper.loop();
}
}
메인 스레드는 스레드 1 요청 비트 맵을 얻으려면. 비트 맵이 있으면 주 스레드로 반환됩니다. 비트 맵이 존재하지 않으면, Thread-1은 Thread-2에게 그것을 다운로드하도록 요청합니다. Handler는 Thread-1에서 만들어 지므로 Thread-2는 다운로드가 완료되면 Thread-1에 알려줍니다.
문제는 스레드 -1이 다운로드를 완료하기 전에 실행을 완료하고 종료하기 때문에 스레드 2가 처리기를 통해 메시지를 보낼 때 메시지를 처리 할 수있는 것이 없습니다.
final RequestHandler handler = new RequestHandler()
{
@Override
protected void onComplete(Object response)
{
//This never happens as Thead-1 is already finished when download is complete
DownloadCompleteData data = (DownloadCompleteData)response;
onDownloadComplete(data.success, data.downloadId, data.filePath);
}
};
myExecutor.execute(new Runnable()
{
public void run()
{
//blocking download call
DownloadCompleteData data = download(downloadRequest);
//Thread-2 now sends message back to Thread-1
handler.sendMessage(handler.obtainMessage(COMPLETE, data));
}
});
는 내가 그렇게 살아있을 수 스레드-1에서 무한 루프를 실행하고이 중단 될 때까지 처리 메시지를 유지할 필요가 있다고 생각하지만, 나는 제대로이 작업을 수행하는 방법을 모르겠어요.
누구나 올바른 방법을 알고 계십니까?
스레드 -1은 어떻게 멈 춥니 까? 루퍼는 그렇게하지 않으면 멈추지 않습니다. – zapl
일단 스레드가 run() 메소드를 종료하면 스레드는 메시지 루프에서 더 이상 메시지를 처리하지 않는다고 가정합니다. 명시 적으로 스레드 또는 루퍼를 중지하지 않습니다. 스레드는 실행 프로그램에 의해 관리됩니다. 메시지 루프가 여전히 실행중인 경우 진짜 질문은 Thread-2에서 보낸 메시지가 Thread-1에 수신되지 않는 이유입니다. – JeffG
'Looper.loop()'는 무한 루프입니다. 내부 메시지 큐의 메시지는 해당 루프에서 처리됩니다. 따라서 메시지가 배달 될 때까지 기다릴 수 없습니다 (혼자 기다리므로). 그것이 당신이하는 일인지 확실하지 않습니다. 또한 [HandlerThread] (http://developer.android.com/reference/android/os/HandlerThread.html)를 살펴보십시오. 루퍼 로직을 이미 구현 했으므로 그렇게하지 않아도됩니다. – zapl