草庐IT

android - GZIPInputStream 在 Android 2.3 中因 IOException 而失败,但在所有以前的版本中工作正常?

coder 2023-12-14 原文

我今天将手机更新到 Gingerbread (2.3.2) 并启动了我开发的应用程序,但发现它无法加载数据。该应用程序在我从 1.6 到 2.2 测试过的所有其他 Android 版本上运行良好,但随后在 Gingerbread 中出现 IOException。有人知道 GZipInputStream 或 URL.openStream() 中是否发生了变化吗?

有问题的代码类似于以下内容:

InputStream in = null;
GZIPInputStream zin = null;
URL url = null;
try {
    url = new URL("http://www.test.com/gzipped_data.gz");
    in = url.openStream();
    zin = new GZIPInputStream(in);
}
catch (MalformedURLException e) { 
    return false;
} 
catch (IOException e) {
    return false;
}

在 1.6 到 2.2 中,此代码工作正常,在 2.3 中我得到一个 IOException,其中包含有关魔法 block 不正确的消息。我假设 openStream 发生了一些变化,弄乱了 MIME 类型或此数据上的某些内容。我在其他地方读到 openStream 不是处理 HTTP 连接的最可靠方法,因此这可能是重新编写连接代码的好借口。

最佳答案

我在这里遇到了同样的问题。看起来 Gingerbread (2.3) 改变了 GZipped 流的处理方式。查看“魔术 block ”字符表明 openStream() 自动检测 GZipped 数据并通过正确的流解码器运行它。当然,如果您尝试在同一流上运行另一个 GZIP 解码器,则会失败并抛出 IOException。

有几种方法可以处理这个问题。第一种方式是切换到 HttpClient/HttpGet。但不能保证这在未来也不会改变。基本上,这是让它再次工作的一种技巧。一个更完整的解决方案可能是:

InputStream in = url.openStream();
GZIPInputStream zin;
try {
    zin = (GZIPInputStream)in;
} catch (Exception e) {
    zin = new GZIPInputStream(in);
}

对于旧版本的 Android,尝试转换时会触发异常,而在较新版本的 Android 上,转换会成功。以这种方式滥用异常处理程序并不漂亮,但它确实有效。

当然,对于压缩的底层数据或看起来像是 GZIP 压缩数据的二进制数据来说,这将是一个问题。 Android 开发人员认为此更改不是错误:

http://code.google.com/p/android/issues/detail?id=16227

我不同意。这是严重的破损。

关于android - GZIPInputStream 在 Android 2.3 中因 IOException 而失败,但在所有以前的版本中工作正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131016/

有关android - GZIPInputStream 在 Android 2.3 中因 IOException 而失败,但在所有以前的版本中工作正常?的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 安装多个版本的 Rails 会覆盖以前的安装吗? - 2

    如果我一直输入geminstallrails使用不同版本的Rails会怎样?例如,我可以输入:geminstallrails--verson3.2.10或geminstallrails这给了我版本3.2.12。问题每次安装都会覆盖之前的吗?它会删除所有旧文件并添加我正在安装的新版本吗?或者如果我运行它两次,它会保留一些文件吗?我正在使用Ubuntu。 最佳答案 它将安装两个独立的gem。实际的可执行文件rails将调用最新版本。你可以覆盖它__例如,rails_3.2.10_将执行Rails3.2.10。bundler顺便说一下,如

  3. ruby-on-rails - 为什么 Rails 可以使用 `if` 作为哈希键但在 Ruby 中不能 - 2

    在纯Rubyirb中,不能输入{if:1}。该语句不会终止,因为irb认为if不是符号,而是if语句的开始。那么为什么Rails可以有before_filter接受if作为参数?该指南的代码如下:classOrderunless也会发生同样的事情。 最佳答案 这是一个irb问题,而不是Ruby。bash=>ruby-e"puts({if:1})"bash=#{:if=>1}您可以改用pry。它将正确读取输入。https://github.com/pry/pry 关于ruby-on-rai

  4. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

    我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

  5. ruby - Heroku RACK_ENV 在 Thin 上显示 "development",但在 Unicorn 上显示 "staging" - 2

    我遇到了这种行为,想知道是否有其他人看到过它。我有一个解决方法,因此它不会成为阻碍。我使用Cedar堆栈在Heroku上创建了一个新应用程序。在演示多个环境时,我添加了以下配置变量:herokuconfig:addRACK_ENV=staging--appappname我目视验证环境变量已设置,然后将以下路由放入我的简单Sinatra示例中:get'/?'doENV['RACK_ENV']end当我在笔记本电脑上进行本地测试时,我收到了预期的开发。当我推送到Heroku并在herokuapp.com上点击相同的路线时,我得到了development而不是staging。我通过Procf

  6. ruby - Ruby gems 的问题(损坏?)试图让指南针在 npm 中工作 - 2

    我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3

  7. ruby - 如何使它在 Rails 3 中工作? - 2

    我正在更新一个Rails项目,发现一段代码在Rails3和Ruby1.9.2中不起作用(它在Rails2.3和Ruby1.8.7中起作用)而且看起来很乱!defspeech_box(title,options={},&block)block_to_partial'layouts/speech_box',options.merge(:title=>title),&blockenddefblock_to_partial(partial_name,options={},&block)options.merge!(:body=>capture(&block))concat(render(:pa

  8. ruby - 无法让测试单元启动在 ruby​​ 1.9.2 中工作 - 2

    我正在使用Ruby1.9.2(ruby-vyields:ruby1.9.2p290(2011-07-09revision32553)[x86_64-linux]),我正在尝试让它工作:require'test/unit'classTestStartup当我运行它时,我得到了Loadedsuitetest_startupStartedintest1.Finishedin0.000395seconds.1tests,0assertions,0failures,0errors,0skips我很难找到有关此功能的文档,除了SO等上的零散帖子。是的,我想使用这个功能而不是设置。TIA

  9. ruby-on-rails - 让字体在 Rails 3.1 中工作? - 2

    不知道怎么回事。看来我做对了。我正在尝试使用FontAwesome在我的应用程序中,但字体没有出现。我有一个名为fonts的文件夹,在我的application.rb中包含以下行:classApplication而不是拥有Font-Awesome附带的2个css文件(更改见下文)(不需要IE7文件)我只是将主要的css放在我的应用程序.css。比我更改url来检测字体文件。@font-face{font-family:"FontAwesome";src:url('');src:url('')format('woff'),url('')format('truetype'),url('')

  10. ruby - 让 JRuby 在 RubyMine 中工作 - 2

    我设置了正确的SDK,因为我所有的ruby​​代码都可以编译,但RubyMine提示说它找不到我的任何Java类?这是一个缺陷还是有办法让它识别类在哪里?这是我的代码,我已经在它提示的所有地方下划线了require'java'include_class'java.awt.event.ActionListener'include_class'javax.swing.JButton'include_class'javax.swing.JFrame'classClickActionincludeActionListenerdefaction_performed(event)puts"Butt

随机推荐