【问题标题】:Android WebView getHitTestResult() in async task crashes the app异步任务中的 Android WebView getHitTestResult() 使应用程序崩溃
【发布时间】:2014-05-29 07:19:02
【问题描述】:

我在 WebView 上实现了上下文菜单,其中 Save image 作为选项。当用户单击该选项时,图像会在 asynctask DownloadImage() 中下载。
在 DownloadImage asynctask 的 doInBackground 内,我有这样的代码:
HitTestResult result = webview.getHitTestResult(); if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { // code to download and save the image }
这在 4.4 之前的所有 android 版本上运行良好。现在,我将 targetSdkversion 从 17 更改为 19,当点击 Save image 选项时,我的应用程序开始在 android 4.4 上崩溃。检查崩溃日志我在 HitTestResult result = webview.getHitTestResult(); 行得到运行时异常。但如果我再次将 targetSdkVersion 设置为 17,它仍然可以在 Android 4.4 上正常运行。
我认为它在某种程度上与基于 Chromium 的新 Android 4.4(API 级别 19)有关。更具体地与此相关:
http://developer.android.com/guide/webapps/migrating.html#Threads
现在我想知道是否应该将 targetSdkversion 设置为 17 并发布构建或做一些其他解决方法来解决这个问题?
什么是最好的解决方案?

【问题讨论】:

    标签: android android-asynctask android-webview


    【解决方案1】:

    就像文档说的那样:解决方案是只在 UI 线程上调用 WebView 方法。例外是有意的 - 新应用程序不应从后台线程调用 WebView 方法。首选的解决方案是将 targetSdk 设置为 19 并更新您的代码。

    在您的情况下,您似乎可以从“保存图像”菜单选项处理程序(在 UI 线程上运行,对吗?)获取 webview.getHitTestResult().getType() 的值并将其保存为AsyncTask 中的字段。

    【讨论】:

    • 是的,你是对的。我正在从菜单选项处理程序调用异步方法所以我只能在那里获取值。为此,我必须重构代码并将必要的值作为参数传递给异步任务。如果我采用文档中提到的方法,我可以像这样包装我当前的代码:runOnUiThread(new Runnable() { @Override public void run() { // current code for image download and save }}); 这种方法好吗?
    • @r.bhardwaj - 如果代码没有阻塞并且没有执行 IO,那么它可能没问题,但我猜有一些原因将它写为第一个异步任务地点。
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多