#java #android #https #http-post #illegalstateexception
#java #Android #https #http-post #исключение illegalstateexception
Вопрос:
Я пытаюсь загрузить файл через POST на Android, проверить ход загрузки и сохранить его в файл на SD-карте. Вот код моего AsyncTask
:
class DownloadFileAsync extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... arg) {
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", arg[0]));
StringBuilder result = new StringBuilder();
boolean first = true;
for (NameValuePair pair : params) {
if (first)
first = false;
else
result.append("amp;");
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}
byte[] postDataBytes = result.toString().getBytes("UTF-8");
URL url = new URL(DOWNLOAD_URL);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("POST");
conn.setReadTimeout(10000);
conn.setRequestProperty("Content-Length",
String.valueOf(postDataBytes.length));
conn.setConnectTimeout(15000);
conn.setDoOutput(true);
conn.getOutputStream().write(postDataBytes);
int lenghtOfFile = conn.getContentLength();
FileOutputStream f = new FileOutputStream(new File(rootDir
"/__test/", fileName));
conn.setDoInput(true);
InputStream in = conn.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
long total = 0;
while ((len1 = in.read(buffer)) > 0) {
total = len1;
publishProgress("" (int) ((total * 100) / lenghtOfFile));
f.write(buffer, 0, len1);
}
f.close();
conn.connect();
} catch (Exception e) {
e.printStackTrace();
DebugLog.e(TAG, e.getMessage());
}
return null;
}
protected void onProgressUpdate(String... progress) {
DebugLog.d(TAG, progress[0]);
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
public void checkAndCreateDirectory(String dirName) {
File new_dir = new File(rootDir dirName);
if (!new_dir.exists()) {
new_dir.mkdirs();
}
}
Проблема в том, что когда я пытаюсь использовать setDoInput()
setDoOutput()
методы and одновременно, я получаю сообщение об java.lang.IllegalStateException: Already connected
ошибке. Как я могу это решить?
Ответ №1:
Выполняйте оба conn.setDoInput(true)
и conn.setDoOutput(true)
раньше conn.getOutputStream()
.