- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
全部,
我知道默认情况下,当屏幕方向改变或键盘滑入或滑出时, Activity 将被终止并重新启动。 (参见 Activity restart on rotation Android )。我的问题是,从 native 代码的角度来看,处理此问题的正确方法是什么?例如如果我有一个加载 native 库的静态 block 并且我的应用程序重新启动,我如何确保 native 土地上的任何内存都得到适当处理?问题是
When we rotate the device, it looks like a separate Thread pool is created and the old ones are never removed. This means that every time someone turns the device, we have a ton more threads sitting idle and taking up memory
我如何确保不会发生这种情况?我从 JNIExample page 底部看到一些注释:
[*]Unresolved issues and bugs Even though the example is fully functional, there are a couple unresolved issues remaining, which I was not able to figure out so far. Problems appear when you start the activity, then press the Back button to hide it, and then start it again. In my experience, calls to native functions in such restarted activity will fail spectacularly. callVoid() simply crashes with a segmentation fault, while calls to getNewData() and getDataString() cause JVM to abort with an error, because it is no longer happy with the globally cached object reference. It appears that activity restart somehow invalidates our cached object references, even though they are protected with NewGlobalRef(), and the activity is running within the original JVM (activity restart does not mean that JVM itself is restarted). I don't have a good explanation on why that happens, so if you have any ideas, please let me know.
这个问题解决了吗?
最佳答案
在 Android NDK 中重启很烦人。您拥有的任何静态数据都会保留下来,因为它会重用该过程,因此您需要手动重置任何在新运行时无效的内容(如任何 OpenGL 纹理或顶点缓冲对象)。它为您提供了一个新的 Java 线程和新的 Java 应用程序以及其他对象,因此还需要清除对您的应用程序新实例中新对象的任何缓存全局引用。
所以我使用的策略是双重的:最小化重新启动,并在重新启动时核对所有内容。
您可以通过处理应用程序内的 configChanges 来最大程度地减少重启,正如您在对所链接问题的回答中所说的那样。然后打开键盘或旋转键盘不会导致应用重新启动,这对于任何具有重要启动时间的应用来说都应该如此。
当我检测到我的应用程序的一个新实例已启动时,我会释放旧实例中的所有关键内容,包括释放我通过 NewGlobalRef 保留的所有 Java 对象。我试图尽量减少静态数据,但在我确实保留静态对象的少数不可避免的地方,当我检测到新实例启动时,我会清除它们。
一旦不再有对旧线程的引用(即,一旦您释放了所有 NewGlobalRef 对象),旧线程就应该消失。
关于java - 安卓NDK : How to clean up native code after restarting activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991193/
我的 Windows 使用 Ubuntu 设置了 WSL。它已经工作了一段时间,直到我升级到 WSL2。 问题是:每次我启动我的电脑(或重新启动我的电脑)时,它都会失去从 Ubuntu 到 Windo
我正在使用 docker 版本 1.1.0,由 systemd 使用命令行启动 /usr/bin/docker -d ,并试图: 运行容器 停止 docker 服务 重新启动 docker 服务(使用
鉴于以下(为了论证而简化)docker-compose.yml文件: version: '3' services: postgres: image: fleetit-postgres
我使用 Vertx SockJs 构建了一个 Eventbus 桥。 这是我的verticle的代码: @Override public void start() throws Exception {
使用docker stack deploy,我可以看到如下信息: Ignoring unsupported options: restart 是否意味着重启政策没有到位? 是否必须在撰写文件之外指定它
我们的 Varnish 实例 /usr/sbin/varnishd -P /var/run/varnish.pid -a :6081 -f /etc/varnish/cm-varnish.vcl -
Varnish 是否保留崩溃/重启日志? 我目前正在监控一个 varnish 服务器,它似乎每周都会重新启动,当 CPU 使用率达到大约 100%(负载有点高 - 在 2 核机器上大约 6~7)并且
我有一个 Android 应用程序,在您第一次运行时运行良好。但是,当您按 HOME(因此暂停)并从主屏幕重新启动它时,我得到的只是音乐重新启动。 我还没有进入保存/恢复状态的阶段(很快就会完成!)。
我的应用程序有一个服务,每 X 分钟对数据库执行与 stopSelf() 相同的操作,并进入 onDestroy 方法我已经放置了这段代码以便在同一时间后重新启动服务: @Override publi
复制代码 代码如下: '******************************************************************** '* '* 
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我检查了我在 ECS 集群中运行的一个 docker 容器,它的重启策略为空白(“{{ .HostConfig.RestartPolicy.Name }}”)。我不确定 ECS 在发生故障时会做什么,
我用 Google Cloud Shell运行 Jupyter Notebook在实例上,但在 1 hours 之后,连接断开。 我重新连接到实例,什么都没有,与重置实例相同。 So, please
Java中是否有任何命令或程序可以重新启动我的应用程序本身? 我开发了一个 Java 桌面应用程序,但过了一段时间它就会挂起。我不知道为什么,所以我想重新启动我的应用程序本身。是否可以? 最佳答案 你
我已经创建了一个容器,却忘记了在创建容器时设置--restart ='always'。 是否可以为已经创建的容器修改此选项?我知道我可以创建一个新的,但这很有用,因为它发生在我身上好几次了... 最佳
是否可以使用 pm2 重新启动特定组的应用程序?像 pm2 restart service-* 重新启动 service-a 和 service-b 之类的东西?我发现 pm2 restart ser
我是一个刚开始使用C++编写代码已经有几个星期了。我已经编写了一个程序来拥有一个菜单,用户可以从中选择执行不同任务的选项。我有两个问题:首先,我该如何做,以便在执行任务后将用户发送回菜单;其次,当用户
所以我有一个应用程序,用户通过 3 个 View Controller 然后向 Facebook 提交图片。在他们将其提交到 Facebook 后,我希望他们能够选择重新启动该过程,就好像他们重新启动
我正在尝试构建一个 hadoop Dockerfile。 在构建过程中,我添加了: && apt install -y openssh-client \ && apt install -y o
当您运行docker run时,可以选择添加--rm和--restart。但是,如何在dockerfile中获得相同的效果? 最佳答案 Dockerfile用于指定构建镜像的指令。 生成镜像后,可以使
我是一名优秀的程序员,十分优秀!