3

我在 android 2.3.x 上NoSuchMethodError: libcore.io.IoUtils.closeQuietly使用时得到URLConnection

我使用 URLConnection 在本地保存文件并使用缓存。

我的应用程序应该在 android 2.3.x 上运行,但由于一些 AndroidManifest.xml 定义而使用 API17 编译。

我使用 JRE7。也许降级到 JRE6 会有所帮助?

有什么原因导致它或如何解决它?

我的代码:

    public synchronized boolean saveFileLocally(String strUrl, String fileName) {
    boolean res = false;
    if (strUrl == null || fileName == null)
        return res;

    URL url = null;
    InputStream input = null;
    OutputStream output = null;
    try {
        url = new URL(strUrl);
        URLConnection connection;
        connection = url.openConnection();
        connection.setUseCaches(true);
        connection.connect();
        input = connection.getInputStream(); // HERE I GET THE EXCEPTION

        byte[] buffer = getTempBitmapStorage();
        output = new FileOutputStream(fileName);

        int bytesRead = 0;
        while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
            output.write(buffer, 0, bytesRead);
        }

        res = true;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (input != null) {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (output != null) {
        try {
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return res;
}

日志猫:

 java.lang.NoSuchMethodError: libcore.io.IoUtils.closeQuietly
        at libcore.net.http.HttpConnection.closeSocketAndStreams(HttpConnection.java:136)
        at libcore.net.http.HttpEngine.release(HttpEngine.java:517)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
        at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:181)
        at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:273)
        at com.aa.android.utilslib.web.WebHelper.saveFileLocally(WebHelper.java:632)
        at com.bb.android.GCMIntentService.handleReceivedData(GCMIntentService.java:155)
        at com.bb.android.GCMIntentService.onMessage(GCMIntentService.java:81)
        at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:130)
        at android.os.HandlerThread.run(HandlerThread.java:60)
4

2 回答 2

2

在 locat 中查看您的错误并在此处转到此链接:

public void closeSocketAndStreams() {
    IoUtils.closeQuietly(sslOutputStream);
    IoUtils.closeQuietly(sslInputStream);
    IoUtils.closeQuietly(sslSocket);
    IoUtils.closeQuietly(outputStream);
    IoUtils.closeQuietly(inputStream);
    IoUtils.closeQuietly(socket);
}

第 136 行是:IoUtils.closeQuietly(inputStream);

我们可以看到这个方法调用 IoUtils.closeQuietly 并带有InputStream参数。

但是当你看到这里查看 IoUtils 类时

您无法使用InputStream参数找到closeQuietly 。所以,我认为这是错误的原因。您应该找到另一个库或版本。

我的英语不是很好。给您带来的不便,我深表歉意

于 2013-10-11T09:55:01.937 回答
0

你如何让 HttpsURLConnectionImpl 调用 IoUtils.closeQuietly?您是否包含 HttpResponseCache 库的外部版本并从源代码构建它?如果是这样,那可能是导致您的问题的原因(您应该将其作为 jar 包含在内)。

只是出于好奇,如果您比较 Gingerbread 的来源与 4.3 at

https://android.googlesource.com/platform/libcore/+/gingerbread/luni/src/main/java/libcore/io/IoUtils.java

https://android.googlesource.com/platform/libcore/+/android-4.3_r1/luni/src/main/java/libcore/io/IoUtils.java

你会看到 Gingerbread 缺少 closeQuietly(Socket) 的实现。但是,无论您使用的是哪个版本的 HttpsURLConnectionImpl,都需要一个不同版本的 IoUtils,它可能来自特定 HttpsURLConnectionImpl 的来源。

于 2013-12-03T20:22:45.753 回答