在创建它的Activity被销毁后,Android线程会发生什么?

Zar*_*jio 18 java multithreading android android-activity

在我的Android应用程序中,主Activity有时会启动一个Thread来从服务器加载数据.该线程修改应用程序的数据库并编辑一些重要文件.AFAIK,似乎这个线程继续执行.如果Android进入低内存状态并决定终止整个应用程序,该线程会发生什么?这个线程可能会过早死亡吗?如果是这样,有什么方法我可以看到该线程被杀死,并做一些事情吗?

我问,因为这个线程修改了数据库中的重要数据,如果它突然被杀死,应用程序可能会停止正常运行.

Squ*_*onk 16

AFAIK,似乎这个线程继续执行.

这是事实,但你无法保证线程能保持多久.

如果Android进入低内存状态并决定终止整个应用程序,该线程会发生什么?

根据我的经验,这实际上是一种相当罕见的情况,但它取决于设备的可用内存和用户的行为,例如他们大量使用设备并启动多个应用程序.

这个线程可能会过早死亡吗?

如果是这样,有什么方法我可以看到该线程被杀死,并做一些事情吗?

没有

我问,因为这个线程修改了数据库中的重要数据,如果它突然被杀死,应用程序可能会停止正常运行.

你所描述的可以被归类为"关键任务".正如其他两个答案所指出的那样,服务将是一种更强大的服务方式,因为服务是在低内存情况下被"杀死"的最后一件事.使用START_REDELIVER_INTENT可能有助于恢复它正在做的事情.

在任何情况下,如果您有"关键任务"操作,则需要设计完全恢复的代码,例如事务的使用以及出现错误时回滚的可能性.


Ted*_*opp 5

听起来你应该将db更新移动到服务.一旦活动进入后台,Android会假定其进程可以在必要时终止,并在以后重新启动而不会产生不良影响.有关详细信息,请参阅应用程序基础知识.


dim*_*imi 5

您应该使用服务:

因为运行服务的进程的排名高于具有后台活动的进程,所以启动长时间运行的活动可能会为该操作启动服务,而不是简单地创建工作线程 - 特别是如果操作可能比活动寿命长.

看看这里:http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle(我粘贴的文本来自哪里)


小智 5

我可能正在挖掘一个旧线程,但没有人提到一件重要的事情。

每次使用数据库并修改多行时,都应该使用事务来确保数据在出现任何类型的故障(例如线程终止、套接字异常等)时保持有效。

    try{
        db.beginTransaction(); 

        //Do whatever you need to do...    

        db.setTransactionSuccessful();
    }catch(SQLiteException e){
        Log.e("SQLite","Error while updating rows: " + e.getMessage());
    }finally{
        db.endTransaction(); //Commit (if everything ok) or rollback (if any error occured). 
        db.close(); //Close databse;
    }
Run Code Online (Sandbox Code Playgroud)