HttpURLConnection을 사용하여 AsyncTask를 사용하여 파일을 업로드하는 하나의 활동 (MainActivity)이 있습니다. 그것들은 모두 훌륭하고 멋쟁이입니다. 또한 (AsyncTask를 사용하여) 업로드 된 모든 파일의 목록을 MySQL 데이터베이스에 쿼리하는 데 makeHttpRequest와 함께 JSONParser를 사용하는 또 다른 활동 (ListAllFilesActivity)이 있습니다. ListAllFilesActivity 활동도 훌륭하게 작동합니다.HttpURLConnection 및 JSONParser 동시 연결
MainActivity에서 큰 파일에 대한 파일 업로드를 시작한 다음 ListAllFilesActivity를 시작하여 데이터베이스를 쿼리하면 MainActivity에 대한 AsyncTask가 업로드를 완료 할 때까지 데이터베이스 쿼리가 결과를 반환하지 않습니다. 파일 (업로드가 완료 될 때까지 진행 대화 상자가 표시됩니다). 나는 이것이 연결이 "해제"될 때까지 기다리는 것과 관련이 있다고 생각한다. MainActivity에서 파일을 업로드하는 동안 ListAllFilesActivity에 연결하여 결과를 얻을 수있는 방법이 있습니까?
정확하게 표시 할 코드가 확실치 않지만 여기에 일부 발췌 문장이 있습니다. 더 필요한 것이 있으면 알려주세요.
MainActivity.java
fileInputStream = new FileInputStream(fileToUpload);
// open a URL connection to the Servlet
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
if (Build.VERSION.SDK_INT > 13) {
// Needed to add this since the second attempt to upload a file would fail with an EOFException and IOException: null
// http://stackoverflow.com/questions/3352424/httpurlconnection-openconnection-fails-second-time
conn.setRequestProperty("Connection", "close");
}
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
// String to get length to use for setFixedLengthStreamingMode
conn.setFixedLengthStreamingMode(infoSize);
ListAllFilesActivity.java
목록 PARAMS = 새로운 ArrayList를(); AsyncTask에 대한 문서에서 URL
params.add(new BasicNameValuePair("access_token", mAccessToken));
params.add(new BasicNameValuePair("gplus_id", mGPlusId));
params.add(new BasicNameValuePair("id", mId));
JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// Files found...dump them to HashMap
// Getting Array of Products
}
} catch (JSONException e) {
e.printStackTrace();
}
감사합니다. 가부코, 알아두면 좋을 것 같습니다. 그것은 그것이 AsyncTask의 한계가 될 것이라는 생각이 들지 않았습니다. 후속 질문은 다음과 같을 것입니다. 파일 업로드를 위해 스레드/처리기를 사용해야합니까 (실제로 UI 종속성이 없으므로 말입니다. 업로드가 완료되면), AsyncTask를 사용하여 목록을 가져옵니다. 완료되면 UI)? 사용자 경험 관점에서 다른 활동에서 목록을보기 전에 파일 업로드가 완료 될 때까지 기다리지 않아도 좋습니다. 나는 [연구하고있다] (http://bit.ly/14JemmZ),하지만 두 번째 의견은 좋다. – Jason
이러한 업로드의 수명이 UI에 연결되어야하는지 여부를 고려해야합니다. 의존성이 없다는 것을 감안할 때, 이것은 꽤 장기간 실행되는 작업이지만, 대신'IntentService '를 사용하여'Service'에서 이것을 수행하는 것이 합리적 일 수 있습니다. – kabuko
통찰력에 감사드립니다! IntentService를 살펴 보겠습니다. – Jason