当我在android 2.3.x
上使用NoSuchMethodError: libcore.io.IoUtils.closeQuietly
时,我得到URLConnection
我使用URLConnection在本地保存文件并使用缓存。
我的应用应该在Android 2.3.x上运行,但是由于一些AndroidManifest.xml defs而使用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;
}
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)
答案 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,
你会看到Gingerbread缺少closeQuietly(Socket)的实现。但是,无论您使用何种版本的HttpsURLConnectionImpl,都会期待不同版本的IoUtils,它可能来自特定HttpsURLConnectionImpl的来源。