2012-03-01 2 views
1

내 주요 활동은 초기 작업을 수행하고 InitDBActivity를 시작합니다. 이 하나는 내가 데이터베이스가 최신인지 확인하고 필요한 경우 업데이트를하기로되어 있습니다. 다음은 InitDBActivity의 onCreate 메소드에서 수행됩니다.응용 프로그램 중지 후 스레드가 계속 실행 중입니다.

Thread asyncDBCreation = new Thread(new Runnable() { 
       public void run() { 

        SQLiteDatabase db = null; 
        try{ 
         db = dbh.getWritableDatabase(); 
        }catch(Exception ex){ 
         return; 
        } 

        if(dbh.recreateDB(db)){ 
         try{ 
          dbh.insertQueries(dbh.getQueries(getAssets()),db); 
         }catch(Exception ex){ 
          dbh.close(); 
          finish(); 
          return; 
         } 
         dbh.close(); 

         prefEdit.putLong(dbVersion, dbFileVersion); 
         prefEdit.commit(); 

         startActivity(intent); 
         finish(); 
        } 
        else{ 
        } 
       } 
      }); 
      asyncDBCreation.start(); 

문제는 사용자가 '뒤로'버튼을 클릭하면 그 응용 프로그램을 종료한다는 것입니다,하지만이 스레드는 여전히 백그라운드에서 실행됩니다. 어쨌든 일은 끝났지 만,이 스레드가 끝나기 전에 다시 응용 프로그램을 시작하면 모든 것이 엉망이됩니다. 데이터베이스의 데이터가 곱해집니다. 이 스레드를 어떻게 죽일 수 있습니까? 스레드를 중단 thread.interrupt()하지만처럼 중단 될 수있는 상태에있는 스레드 필수 : ​​

자바

답변

1

는, 만 스레드를 중단 스레드를 죽일 수있는 방법을 해달라고, 당신은 방법을 사용할 수 있습니다 수면, 또는 기다립니다.

그래서 여기서 db.close 메서드를 사용하여 데이터베이스를 닫을 수 있습니다. 데이터 쿼리 작업이 예외를 throw합니다. 예외를 catch하여 스레드 작업을 완료 할 수 있습니다.

+0

조금 해킹 된 것처럼 보였지만 효과가있었습니다. – gisek

1

은 Activity.onCreate()에서 threadpool 내에서 스레드의 생성을 관리하고, Activity.onDestroy에서 실행 스레드() 죽일 Future.cancel()를 사용

private Future longRunningTaskFuture; 

public void onCreate(Bundle savedInstanceState) { 
    ... ... 
    ThreadPoolExecutor threadPoolExecutor = Executors.newSingleThreadExecutor(); 
    Runnable longRunningTask = new Runnable(); 
    // submit task to threadpool: 
    Future longRunningTaskFuture = threadPoolExecutor.submit(longRunningTask); 
} 

... ... 
public void onDestroy() { 
    // if you want to kill the task: 
    if (longRunningTaskFuture != null) 
    longRunningTaskFuture.cancel(true); 
    ... ... 
} 

이 방법 취소를 다르게 작업 실행에 행동을 기반으로합니다 자세히 알아 보려면 API를 확인하십시오.

+0

ThreadPoolExecutor threadPoolExecutor = Executors.newSingleThreadExecutor(); 유형 불일치 : ExecutorService에서 ThreadPoolExecutor로 변환 할 수 없습니다. – gisek

+0

@ gisek, ExecutorService를 사용하거나 ThreadPoolExecutor에 캐스트하십시오. – yorkw

+0

ExecutorService를 사용했습니다. 디버거가 longRunningTaskFuture.cancel (으)로 이동합니다. ,하지만이 Runnable을 멈추지는 않습니다. – gisek

관련 문제