안드로이드 개발 질문/답변
(글 수 45,052)
AsyncTask를 이용해서 파일 하나 다운로드 하는건 아래와 같이 구현해서 성공을 했습니다.
문제는 한번에 여러개의 파일을 다운로드를 하고 싶은건데요...
아래 코드에서 단일 다운로드는 잘 구현되는것이므로 이용하시면 됩니다... ^^
단일다운로드의 소스코드를 아랫쪽의 다중 다운로드처럼 변경을 했는데요....
파일이 하나가 다운로드 되고 두번째 파일이 다운로드가 되질 않습니다....
어떤방법을 써야 될까요????
조언 부탁드리겠습니다.....
=========== [단일 다운로드] ==================
호출 : new DownloadFile().execute("파일URL"
, "폰에 저장될 영문 파일명"
, "다이얼로그에 표시될 한글 파일명");
/**
* 파일다운로드 처리 클래스
* 인수값 : URL, 파일명, 타이틀
*/
class DownloadFile extends AsyncTask<String, Integer, String> //인수, 경과값, 결과값
{
protected void onPreExecute()
{
mValue = 0;
mProgress = new ProgressDialog(EtoosOnlineDownList.this);
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgress.setMessage("Wait...");
mProgress.setIndeterminate(false);
mProgress.setCancelable(false);
mProgress.setProgress(0);
mProgress.setMax(100);
mProgress.setSecondaryProgress(0);
mProgress.setButton("취소", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
cancel(true);
}
});
mProgress.show();
}
protected String doInBackground(String... strData)
{
int count;
mProgress.setMessage(strData[2]);
try {
URL url2 = new URL(strData[0]);
URLConnection conexion = url2.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
String des = fu.AppBasicPath() + strDownFolderName + "/" + strData[1];
InputStream input = new BufferedInputStream(url2.openStream());
OutputStream output = new FileOutputStream(des);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1)
{
total += count;
publishProgress((int)(total*100/lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {}
return null;
}
public void onProgressUpdate(Integer... args)
{
mProgress.setProgress(args[0]);
}
protected void onPostExecute(String result)
{
mProgress.dismiss();
}
protected void onCancelled()
{
mProgress.dismiss();
}
}
=========== [다중 다운로드] ==================
아래의 코드를 실행하면
1/2, 진행율:100%
까지 프로그래스다이얼로그가 표시가 되는데 두번째 파일로는 넘어가지가 않습니다....
로직은 맞는듯한데...
구현이 아무래도 문제가 있는듯해 보입니다... ㅠㅠ...
목요일 오후부터 지금 토요일 새벽까지 이것저것 해보고 있는데 영 답이 안나오네요....
여러 고수닙들의 조언을 부탁드리겠습니다.
호출 : new DownloadFile().execute("파일URL1", "파일URL2", "파일URL3")
class DownloadFile extends AsyncTask<String, Integer, String> //인수, 경과값, 결과값
{
int mFileCount=0;
protected void onPreExecute()
{
mValue = 0;
mProgress = new ProgressDialog(EtoosOnlineDownList.this);
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgress.setMessage("Wait...");
mProgress.setIndeterminate(false);
mProgress.setCancelable(false);
mProgress.setProgress(0);
mProgress.setMax(100);
mProgress.setSecondaryProgress(0);
mProgress.setButton("취소", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
cancel(true);
}
});
mProgress.show();
}
protected String doInBackground(String... strData)
{
int strDataCnt = strData.length;
int count;
String sFileName;
do
{
Looper.prepare();
try {
URL url2 = new URL(strData[mFileCount]);
URLConnection conexion = url2.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
sFileName=UrlParsingToFileName(strData[mFileCount]); //파일명을 얻어온다.
String des = fu.AppBasicPath() + strDownFolderName + "/" + sFileName;
InputStream input = new BufferedInputStream(url2.openStream());
OutputStream output = new FileOutputStream(des);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1)
{
total += count;
publishProgress((int)(total*100/lenghtOfFile),mFileCount+1,strDataCnt);
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
}
Looper.loop();
mFileCount++;
}while(mFileCount<strDataCnt); //다운로드 받으려는 파일의 개수만큼 반복하면서 파일을 받는다.
return null;
}
public void onProgressUpdate(Integer... args)
{
mProgress.setProgress(args[0]);
mProgress.setMessage(args[1]+"/"+args[2]+", 진행율:"+args[0]+"%");
if(args[0]==100)
{
//파일하나를 다 받았으면 디비에 저장한다.
}
}
protected void onPostExecute(String result)
{
mProgress.dismiss();
}
protected void onCancelled()
{
mProgress.dismiss();
}
}