2012-05-03 5 views
1

내 응용 프로그램은 실행 프로그램을 사용하여 작업을 수행하는 스레드를 만듭니다.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에서 무한 루프를 실행하고이 중단 될 때까지 처리 메시지를 유지할 필요가 있다고 생각하지만, 나는 제대로이 작업을 수행하는 방법을 모르겠어요.

누구나 올바른 방법을 알고 계십니까?

+0

스레드 -1은 어떻게 멈 춥니 까? 루퍼는 그렇게하지 않으면 멈추지 않습니다. – zapl

+0

일단 스레드가 run() 메소드를 종료하면 스레드는 메시지 루프에서 더 이상 메시지를 처리하지 않는다고 가정합니다. 명시 적으로 스레드 또는 루퍼를 중지하지 않습니다. 스레드는 실행 프로그램에 의해 관리됩니다. 메시지 루프가 여전히 실행중인 경우 진짜 질문은 Thread-2에서 보낸 메시지가 Thread-1에 수신되지 않는 이유입니다. – JeffG

+0

'Looper.loop()'는 무한 루프입니다. 내부 메시지 큐의 메시지는 해당 루프에서 처리됩니다. 따라서 메시지가 배달 될 때까지 기다릴 수 없습니다 (혼자 기다리므로). 그것이 당신이하는 일인지 확실하지 않습니다. 또한 [HandlerThread] (http://developer.android.com/reference/android/os/HandlerThread.html)를 살펴보십시오. 루퍼 로직을 이미 구현 했으므로 그렇게하지 않아도됩니다. – zapl

답변

0

나는 당신이이 방법을 수행하려는 경우 잘 모르겠지만, 당신은 비트 맵을 다운로드 스레드 1

if(bitmapIsntFound) 
{ 
    Thread-2.start(); 
    try 
    { 
     Thread-1.wait(); 
    } 

    catch(InterruptedException e) 
    { 
    System.out.println("Thread-1 
    } 

} 

을이 유사한 코드를이 두 번째 스레드를 시작합니다 시도 할 수 있습니다, 그에게 두 번째 스레드가 실행되는 동안 대기 할 첫 번째 스레드 두 번째 다운로드가 끝나면 Thread-1.notify()를 호출하여 Thread-1을 다시 시작해야한다.

Thread-1 중간 스트림을 일시 중지 했으므로 try {} catch() {} 문을 지나치지 않으므로 Thread-1이 다시 시작될 때 다운로드가 보장되므로 방금 호출 할 수 있습니다 실.

관련 문제