应用程序停止后线程仍在运行

时间:2012-03-01 01:45:43

标签: android multithreading

我的主要活动做了一些初始事情而不是启动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();

问题是,如果用户点击“后退”按钮,他会退出应用,但此线程仍在后台运行。它会很好 - 无论如何工作都会消失,但是......事实证明,如果他在这个线程完成之前再次启动应用程序 - 一切都会搞砸。数据库中的数据相乘。我怎么能杀掉这个帖子?

2 个答案:

答案 0 :(得分:1)

在java中,没有方法可以杀死线程,只有中断的线程,可以使用方法:thread.interrupt()来中断线程,但是线程必须处于可以被中断的状态,如:睡觉,或等待。

所以,这里可以使用db.close方法关闭数据库,数据查询工作会抛出异常,可以捕获异常来完成线程工作。

答案 1 :(得分:1)

在Activity.onCreate()中的threadpool内管理你的线程创建,并使用Future.cancel()来杀死Activity.onDestroy()中正在运行的线程:

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以获取更多详细信息。