2012-03-28 2 views
0

내 응용 프로그램에는 사용자가 종료 버튼을 누를 때까지 실행되는 하나의 서비스가 있습니다. 나는 안드로이드에서 출구 버튼을주는 것이 좋은 디자인이 아니라는 것을 알고 있지만, 내 응용에는 바람직하다.Android에서 프로세스 죽이기없이 백그라운드 스레드를 중지 할 수있는 방법이 있습니까?

내 응용 프로그램에는 HTTP 요청을 보내고 파일을 다운로드 한 다음 백그라운드에서 구문 분석하여 UI가 차단되지 않도록하는 스레드가 있습니다. 내 스레드의 run 메서드에는 파일을 다운로드 한 다음 파싱하는 등의 순차적 인 단계가 있으며 while 또는 for 루프가 없습니다.

사용자가 종료 버튼을 누르면 프로세스가 kill (Process.kiil (pid) 또는 System.exit (0) 사용)없이 실행중인 경우 백그라운드 스레드를 중지 할 수있는 방법이 있습니까?

나는 또한 AsyncTask를 시도했다. 스레드의 run 메소드가 무엇이든 doInBackground 메소드에 넣는다. 사용자가 종료 단추를 누르면 asynctask가 취소되었습니다. 작업을 취소하면 백그라운드 스레드를 완전히 멈추지 않습니다. 파일을 다운로드 한 후 파일을 구문 분석하기 위해 파서 (파싱은 백그라운드 스레드에서 수행되지만 파싱 할 때 doInBackground 또는 메소드를 실행하지 않기 때문입니다. 파싱 메서드에서 수행됩니다. 파서 클래스의 또는 기본 처리기 클래스에서 구문 분석.)

검색에서 나는 많은 블로그와 스레드에 대한 다른 stackoverflow 질문을 읽었지만 여전히 그것에 대한 해결책을 찾을 수 없습니다. 당신이

if(stillRunning){ 
//next step 
} 

같은 라인을 추가 할 수 있습니다 각 단계 전에 ... 사전에 ....

답변

0

정지 스레드가

Process.killProcess(Process.myPid()); 
0

을 감사 도와주세요 당신이 그것을 중지 할 때, 당신은 false로 stillRunning을 설정합니다.

+0

를 사용하지 않고 수 없습니다 그러나 XML 파서 ([이] (HTTP와 같은 기본 핸들러의 서브 클래스의 모든 단계에서 가능한 방법 : //www.ibm.com/developerworks/kr/opensource/library/x-android/index.html) ( ) Listing 6. SAX 핸들러 –

0

(1)

  finish(); 
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    startActivity(intent); 

(2) 당신이 정지 방법

  Thread myThread = new Thread() 
     { 
      public void run() 
      { 
       Looper.prepare(); 
       doMyWork(); 
      } 


     }.start(); 

를 호출하여 중지하고 중지를 호출 할 수 있습니다 대신 asynk 작업의 새로운 스레드를 사용하는 대신 출구의 응용 프로그램을 중지하려면이 옵션을 사용 on myThread

+0

그러나 stop 메소드를 사용할 때는주의해야한다 this http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class 및이 http://stackoverflow.com/questions/94011/how-to-abort-a-thread-in-a-fast - 및 - 클린 - 방법 - 자바 – vipin

+0

첫 번째 옵션에 대한 그것은 백그라운드 스레드를 중지하지 않습니다. 그것은 완료됩니다 활동 만. 두 번째 옵션 인 thread의 stop() 메소드가 deprycated됩니다. –

+0

첫번째 스레드는 스레드를 멈추기위한 것이 아닙니다. 좋은 연습이 아니기 때문에 출구를 사용하고 있습니다. 응용 프로그램을 닫으려고하는 출구의 장소에서 사용하십시오. – vipin

0

아마도 연결 및 파서는 동일한 InputStream을 사용합니다. 종료하면 스트림과 연결을 닫으십시오. 이 경우 어떤 종류의 Exception이 Throw되고 백그라운드 스레드는 오류없이 매우 빠르게 작업을 완료합니다. 파일 저장 중일 경우, 취소 (취소)되었거나 FileOutputStream을 닫으려고하면 모든 쓰기 (버퍼)를 확인해야합니다.

는 (종료 이벤트가 UI에서 발생) 예에서
+0

아니 두 용도가 서로 다른 스트림입니다. –

+0

그래서 모두 닫습니다 :) –

관련 문제