草庐IT

android - 执行 onPause() 时应用程序终止。关于如何处理这种情况的任何提示?

coder 2023-12-24 原文

我的应用程序在 onPause() 期间将其当前图像数据保存到文件,以在 session 之间持久保存它。 但是,我注意到,如果我在应用程序位于前台时关闭设备,应用程序会连续多次暂停和重新启动,然后最终在 onPause().

onPause() 中,我通过调用 gLSurfaceView.queueEvent() 请求并等待来自 GLSurfaceView 渲染器线程的图像数据> 使用 FutureTask,然后调用 futureTask.get()。然后,在获取数据后,我调用 gLSurfaceView.onPause() 并将数据写入外部存储器上的文件。之后我调用 super.onPause()

但是,看起来 onPause() 在写入外部存储时被中断,因此当应用程序下次重新启动时,它会报告 java.io.EOFException尝试读取保存的数据时。

我记录了关闭设备时发生的情况。这是踪迹:

05-17 16:03:47.405: V/App(4633): onPause called
05-17 16:03:47.405: V/App(4633): Get data from render thread.
05-17 16:03:47.670: V/App(4633): Got data from render thread.
05-17 16:03:47.855: V/App(4633): Save image start
05-17 16:03:48.265: V/App(4633): Image saved!
05-17 16:03:48.265: V/App(4633): super.onPause()
05-17 16:03:48.270: V/App(4633): onPause finished
05-17 16:03:48.270: V/App(4633): onSaveInstanceState()
05-17 16:03:48.315: V/App(4633): onCreate()
05-17 16:03:48.345: V/App(4633): restoreState() with bundle
05-17 16:03:48.345: V/App(4633): Start read image.
05-17 16:03:49.055: V/App(4633): Image read
05-17 16:03:49.715: V/App(4633): onResume()
05-17 16:03:51.595: V/App(4633): onPause called
05-17 16:03:51.595: V/App(4633): Get data from render thread.
05-17 16:03:51.770: V/App(4633): Got data from render thread.
05-17 16:03:51.910: V/App(4633): Save image start
05-17 16:03:52.580: V/App(4633): Image saved!
05-17 16:03:52.580: V/App(4633): super.onPause()
05-17 16:03:52.580: V/App(4633): onPause finished
05-17 16:03:52.585: V/App(4633): onSaveInstanceState()
05-17 16:03:53.795: V/App(4633): onResume()
05-17 16:03:53.805: V/App(4633): onPause called
05-17 16:03:53.805: V/App(4633): Get data from render thread.
05-17 16:03:54.205: V/App(4633): Got data from render thread.
05-17 16:03:54.520: V/App(4633): Save image start

之后,设备关闭,或者至少日志记录停止。

据推测,数据在前 2 次保存正确,但在第 3 次因为应用程序未完成写入文件而被破坏。

我正在考虑实现一个双缓冲区解决方案,我将交替写入数据的缓冲区,并在成功写入后保存对包含最新数据的缓冲区的引用。但我认为必须有更简单的方法。

关于如何避免/解决此问题的任何建议?

注意:由于整个 onPause() 花费了将近 1 秒,我还尝试在后台线程中执行序列 [从 GLSurfaceView 读取,暂停 GLSurfaceView 并保存到文件],但随后我也遇到了 onCreate( ) 尝试在后台线程仍在写入图像数据时读取图像数据,这显然也会导致错误。

最佳答案

您是否恰好在调用 onPause() 期间将图像保存在 UI 线程中?如果是,您应该将图像保存部分移动到 AsyncTask 中,并提供某种 bool 标志或互斥锁,以防止在上一个图像仍在保存或已经保存时启动类似的 AsyncTasks。

小心使用上下文和内部类数据,以防万一你的 AsyncTask 比你的其他类活得更久,并确保它不会触及任何不属于它的东西。

关于android - 执行 onPause() 时应用程序终止。关于如何处理这种情况的任何提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631780/

有关android - 执行 onPause() 时应用程序终止。关于如何处理这种情况的任何提示?的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  10. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

随机推荐