Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建安卓线程的活动被销毁后,安卓线程会发生什么情况?_Java_Android_Multithreading_Android Activity - Fatal编程技术网

Java 创建安卓线程的活动被销毁后,安卓线程会发生什么情况?

Java 创建安卓线程的活动被销毁后,安卓线程会发生什么情况?,java,android,multithreading,android-activity,Java,Android,Multithreading,Android Activity,在我的Android应用程序中,主活动有时会启动一个线程从服务器加载数据。此线程修改应用程序的数据库并编辑一些重要文件。好了,看来这个线程还在继续执行。如果Android进入内存不足的状态并决定杀死整个应用程序,那么这个线程会发生什么?如果这条线可能过早死亡,会有什么情况吗?如果是这样的话,我是否可以看到线程正在被终止,并对此采取一些措施 我这样问是因为这个线程修改了数据库中的重要数据,如果它突然被终止,应用程序可能会停止正常运行。听起来你应该将数据库更新移动到一个服务。一旦一个活动进入后台,A

在我的Android应用程序中,主活动有时会启动一个线程从服务器加载数据。此线程修改应用程序的数据库并编辑一些重要文件。好了,看来这个线程还在继续执行。如果Android进入内存不足的状态并决定杀死整个应用程序,那么这个线程会发生什么?如果这条线可能过早死亡,会有什么情况吗?如果是这样的话,我是否可以看到线程正在被终止,并对此采取一些措施


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

听起来你应该将数据库更新移动到一个服务。一旦一个活动进入后台,Android就认为它的进程可以在必要时关闭,然后重新启动而不会产生不良影响。有关更多信息,请参阅。

您应该使用以下服务:

因为运行服务的进程是 排名高于具有 背景活动,一项活动 这将启动一个长期运行的过程 手术可能会很好地开始一个新的治疗 而不是为那次行动提供服务 而不仅仅是创造一个工人 线程,特别是当操作 可能会持续时间更长

看看这里:(我粘贴的文本的来源)

好了,看来这个线程还在继续执行

这是真的,但是你不能保证线程能活多久

如果Android进入内存不足的状态并决定杀死整个应用程序,那么这个线程会发生什么

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

如果这条线可能过早死亡,会有什么情况吗

如果是这样的话,我是否可以看到线程正在被终止,并对此采取一些措施

没有

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

你所描述的可以归类为“任务关键型”的东西。正如其他两个答案所指出的,服务将是一种更健壮的做事方式,因为在内存不足的情况下,服务是最后被“杀死”的东西之一。使用START\u REDELIVER\u INTENT可能有助于恢复它所做的工作


在任何情况下,如果您有一个“任务关键型”操作,那么您需要为完全恢复设计代码,例如使用事务和在出现错误时回滚的可能性。

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

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


当然,你可以做点什么。但一旦你允许应用程序被销毁,就不要在
onstroy
中设置一个线程可以轮询的标志,以知道应用程序有消失的风险。清除
onResume
中的该标志。线程在尽可能短的块中完成它的工作,如果它看到那个标志,它就结束它自己。在每个块的末尾,它更新文件中的进度状态,以便可以正确地重新启动。同样在顶部的
中,在
之前不要返回!thread.isAlive
或1秒-使用测试和计数器循环,每次睡眠100毫秒,不超过10次。线程还需要在任何长时间延迟后(例如,来自服务器的响应)和执行关键操作(更新本地文件/数据库)之前检查标志。它从不以该标志集开始关键部分。只要临界截面不超过100-200 ms,我认为您在实践中是安全的。(并不是说这对任务关键型应用程序来说是一个好方法,但对我们大多数人来说已经足够了。)请注意,我的方法的本质是在应用程序仍在运行的情况下进行工作-将
桌面上的
延迟最多1秒。对于许多情况,这就是所需要的。更新:我建议最多延迟1秒,这太长了,不适合
onStop
。需要研究多长时间是合适的——Android对合理时间的定义是什么。请注意,如果有任何Android应该稍微宽松的UI调用,那就是顶部的
,因为这是应用程序最后一次确保他们保留了他们所关心的东西。
    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;
    }