我的主要活动做了一些初始事情而不是启动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();
问题是,如果用户点击“后退”按钮,他会退出应用,但此线程仍在后台运行。它会很好 - 无论如何工作都会消失,但是......事实证明,如果他在这个线程完成之前再次启动应用程序 - 一切都会搞砸。数据库中的数据相乘。我怎么能杀掉这个帖子?
答案 0 :(得分:1)
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以获取更多详细信息。