2013-08-01 3 views
0

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(); 
} 

답변

3

에서 // 점점 JSON 문자열 :

처음 소개

, AsyncTasks 단일 백그라운드 스레드에서 순차적으로 실행되었다. DONUT으로 시작하여 여러 스레드가 병렬로 작동 할 수 있도록 스레드 풀로 변경되었습니다. HONEYCOMB으로 시작하는 작업은 병렬 실행으로 인한 공통 응용 프로그램 오류를 피하기 위해 단일 스레드에서 실행됩니다.

병렬 실행을 진정으로 원하는 경우 THREAD_POOL_EXECUTOR으로 executeOnExecutor(java.util.concurrent.Executor, Object[])을 호출 할 수 있습니다.

+0

감사합니다. 가부코, 알아두면 좋을 것 같습니다. 그것은 그것이 AsyncTask의 한계가 될 것이라는 생각이 들지 않았습니다. 후속 질문은 다음과 같을 것입니다. 파일 업로드를 위해 스레드/처리기를 사용해야합니까 (실제로 UI 종속성이 없으므로 말입니다. 업로드가 완료되면), AsyncTask를 사용하여 목록을 가져옵니다. 완료되면 UI)? 사용자 경험 관점에서 다른 활동에서 목록을보기 전에 파일 업로드가 완료 될 때까지 기다리지 않아도 좋습니다. 나는 [연구하고있다] (http://bit.ly/14JemmZ),하지만 두 번째 의견은 좋다. – Jason

+0

이러한 업로드의 수명이 UI에 연결되어야하는지 여부를 고려해야합니다. 의존성이 없다는 것을 감안할 때, 이것은 꽤 장기간 실행되는 작업이지만, 대신'IntentService '를 사용하여'Service'에서 이것을 수행하는 것이 합리적 일 수 있습니다. – kabuko

+0

통찰력에 감사드립니다! IntentService를 살펴 보겠습니다. – Jason