1

我正在开发这个 android 应用程序,它基本上将图像上传到 web 服务。我有一个异步任务,我使用以下代码将文件发送到服务器:

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 中,捕获 IOExceptions 等。问题是当我在看到第一个 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 连接时,立即抛出异常(当然,这更方便)。

对此有任何想法吗?

4

2 回答 2

1

不久前,我们也遇到过这个问题,但仅限于搭载 Android 2.3.4 的三星 Galaxy SII。所有其他设备都没有这个问题。没有办法解决这个问题。

于 2013-03-29T14:25:02.543 回答
0

您不需要使用 urlConnection.connect():当您执行 .getOutputStream() 时,连接是隐式打开的。此外,如果您制作了 .connect(),则无法在 .getOutputStream() 之前完成。此外,您必须设置 Content-Type 标头:

urlConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
于 2013-03-28T18:15:44.693 回答