2009-06-20 3 views
4

모바일 앱은 원격지에서 이메일 첨부 파일을 다운로드 할 수있는 옵션을 사용자에게 제공합니다. 원격 서버에 연결하고 콘텐츠를 다운로드하는 것은 별도의 스레드에서 수행됩니다. 취소 명령과 함께 사용자에게 표시됩니다. 내가 의사 코드를 제공하고 있습니다.취소 명령이 사용자에 의해 트리거 될 때 스레드 중지

new Thread(new Runnable() 
    public void run(){ 
    try{ 
    //open connection to remote server 
    //get data input stream 
    //create byte array of length attachment size 
    //show modeless dialog with the message "Downloading..." 
    for(int i=0;i<attachmentSize;i++){ 
     //set the progress indicator of the modeless dialog based upon for iteration 
     //read the byte from input stream and store it in byte array 
    } 
     //open file connection outputstream and store the downloaded content as a file in mobile file system 
     //show dialog with the message "attachment successfully downloaded" 
     } 
     catch(IOException ioe) { } 
     catch(Exception ex) { } 
    } 
).start(); 

이제 진행률 표시기가있는 대화 상자에 취소 명령을 추가하는 중입니다. 사용자가 모바일에서 "취소"명령을 클릭하면, dispose() 메소드를 호출하여 모덜리스 대화 상자를 삭제할 수 있습니다. 스트리밍을 통해 전자 메일 첨부 파일을 가져 오는 스레드를 갑자기 중지 할 수 있습니까? 이 문제를 해결할 수 있도록 도와주세요.

답변

0

저는 전문가가 아니므로 제 경험이 자바 스레드에 제한되어 있으므로 소금으로 제 제안을하십시오.

실행중인 스레드를 중지 할 수 없습니다. 가능한 한 빨리 종료 할 수 있습니다. 따라서 할 수있는 일은 예를 들어 보조 스레드에서 주기적으로 테스트하는 공유 플래그를 갖는 것입니다. 주 스레드가 취소 클릭에 응답하여이를 설정하면 보조 스레드가 반환됩니다.

2

갑자기 멈출 수는 있지만 더 큰 문제가됩니다.

public class ClassHoldingRunnable { 

    private volatile boolean stopRequested = false; 

    public void executeAsync() { 

     Runnable r= new Runnable() { 

      public void run() { 

       while (!stopRequested) { 
        // do work 
       } 
      } 
     } 

     new Thread(r).start(); 
    } 

    public void cancel() { 
     stopRequested = true; 
    } 
} 

몇 가지 참고 사항 :

  • 는 stopRequested 플래그가 될위한 중요한

    이 일의 정식 방법은 실행 가능한 체크하는 플래그를하는 것입니다 volatile 또는 여러 스레드에서 액세스 중이므로 다른 공개 설정 보증 (synchronized, Lock, Atomic)을 보유해야합니다.

  • 최종 사용자가 반응 형 GUI를 갖는 것이 중요하다면 stopRequested을 자주 확인해야합니다.
0

내 경험이 C#에서 더 그러나 이것은 여전히 ​​적용 할 수 있습니다 ...

나는 그냥있는 방법은 것보다 더 "스레드를 죽이는"을 찾기 위해 좋은 아이디어라고 생각하지 않습니다 그냥 개체를 삭제하고 소멸자를 건너 뜁니다.

인터럽트를 통해 자살을 알릴 수 있습니다. 그런 다음 스레드의 인터럽트 플래그를 표시기로 사용하거나 잠자기/대기 상태 인 경우 인터럽트 된 예외를 catch하고이를 catch하면 제대로 종료 할 수 있습니다 (finally 블록에서). 이것은 당신이 찾고있는 것을 어느 정도 제공합니다.

1

Connection에서 읽는 스레드를 인터럽트하는 몇 가지 무료 방법이 있습니다.

  • 당신은 아마 InputStream.read에 대한 단일 호출에 걸쳐 반복하여 원격 데이터를 읽고, 그래서 당신은 하나, 상대적으로 작은 바이트 [] 개체를 재사용 할 수 있습니다. 각 반복 전에 부울 멤버 변수를 확인할 수 있습니다. 쓰래드 생성 후에 값을 한 번만 변경해야하기 때문에 그 부울을 동기화 할 필요가 없습니다.

  • 연결을 닫으면 연결 시도가 다음에 시도 할 때 IOException이 throw됩니다. 적절한 JavaME 구현은 Connection을 만들지 않습니다.다른 thread가 Connection의 InputStream로부터 읽고있는 경우에서도, close() 블록을 방아쇠합니다.

관련 문제