NoSuchMethodError:libcore.io.IoUtils.close使用URLConnection时非常安静

时间:2013-10-06 06:59:28

标签: android inputstream urlconnection

当我在android 2.3.x

上使用NoSuchMethodError: libcore.io.IoUtils.closeQuietly时,我得到URLConnection

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

我的应用应该在Android 2.3.x上运行,但是由于一些AndroidManifest.xml defs而使用API​​17进行编译。

我使用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;
}

logcat的:

 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)

2 个答案:

答案 0 :(得分:2)

在locat中查看您的错误,然后转到此链接here

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);

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

但是当你看到here来查看IoUtils类

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

我的英语不好。对于给您带来的不便,我很抱歉

答案 1 :(得分:0)

如何通过HttpsURLConnectionImpl调用IoUtils.closeQuietly?您是否包含HttpResponseCache库的外部版本并且可以从源代码构建它?如果是这样,那可能是导致你的问题的原因(你应该把它包括在一个罐子里)。

只是为了好奇,如果你比较姜饼的来源与4.3,

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的来源。