我正在开发这个android应用程序,它基本上是将图像上传到webservice。我有一个asynctask,我将文件发送到服务器,使用以下代码:
protected Boolean doInBackground(byte[]... params) {
HttpURLConnection connection = getConnection();
BufferedOutputStream out = new BufferedOutputStream(connection.getOutputStream());
Log.d("OutputStream", "stream created, about to write");
out.write(params[0]);
Log.d("OutputStream", "all bytes written");
out.close();
}
当然,这段代码被封装在try catch中,捕获ioexception等。问题是,当我在之后中断连接时,我看到第一个logtext,异常永远不会抛出,或者只是在很长一段时间之后(谈论20分钟左右),这根本没有任何意义。
HttpURLConnection是这样设置的:
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", this.contentType);
urlConnection.setRequestProperty("User-Agent", String.format("custom-user-agent/%d", R.integer.version_code));
urlConnection.addRequestProperty("SessionID", this.sessionID);
urlConnection.setDoOutput(true);
urlConnection.setConnectTimeout(30000);
urlConnection.setReadTimeout(30000);
urlConnection.setChunkedStreamingMode(0);
urlConnection.setUseCaches(false);
urlConnection.connect();
有趣的是,这只发生在中断EDGE/3G连接时。当我中断wifi连接时,异常会立即抛出(当然,这更方便)。
有什么想法吗?
前段时间,我们也遇到了这个问题,但只是在三星Galaxy SII的Android 2.3.4上。所有其他设备都没有这个问题。没有办法绕过这个问题。
您不需要使用urlConnection.connect():当您执行. getoutputstream()时,连接是开放隐式的。此外,如果您使用.connect(),则无法在使用. getoutputstream()之前使用它。另外,您必须设置Content-Type头:
urlConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");