안규 공부방

Android > AsyncTask - 프로그레시브바를 이용한 파일 다운로드 구현

등록일 : 2017-07-06 17:24 조회수 : 93,598

인터넷이나 특정장소에서 파일을 다운받고자 할 때 AsyncTask 클래스와  프로그레시브바 위젯을 이용해 구현한다.

왜냐하면 용량이 클 경우에는  바로 받을수 없고 다 받을 때 까지 기다려야 하기 때문이다.

기다리는 동안 프로그레시브바를 이용해 다른 것은 조작할수 없도록 모달 다이얼로그형태로 띄우는 것이다.

이것은 다양한 형태로 응용이 가능하다. 파일 뿐만 아니라 시간이 걸리는 작업일 경우 자주 이용되고 있기 때문이다.

이번 예제는 인터넷에 연결되어 있는 그림의 URL 을 가지고 네트워크로 접속한후 sdcard 에 저장하는 예제이다.


1. Main activity

메인은 간단하다. 버튼하나만 있으며 클릭하면 다운받을 파일의 URL 을 넘겨주고 DownloadFileAsync 클래스의 execute() 함수를 실행시켜 준다.
 
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			startDownload();
			break;
	 
		default:
			break;
		}
	}
	 
	private void startDownload() {
		String url = "http://cfs11.blog.daum.net/image/5/blog/2008/08/22/18/15/48ae83c8edc9d&filename=DSC04470.JPG";
		new DownloadFileAsync(this).execute(url, "1", "1");
	} 
	


2. 파일 다운로드를 위한 AsyncTask 클래스

여기서는 크게 4부분으로 구현되는데 AsyncTask 객체가 시작되는 부분인 onPreExecute(), 시작후 돌아가는 중심로직이 들어가는 함수 doInBackground(),

실시간으로 작업결과를 프로그레시브바에 업데이트 하는 onProgressUpdate(), 그리고 마지막으로 종료할 때 프로그레시브바를 사라지게 하는 onPostExcute()

로 구성되어있다.

프로그레시브바의 객체를 생성하고 화면에 보여준다.
 
		@Override
		protected void onPreExecute() {
			mDlg = new ProgressDialog(mContext);
			mDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mDlg.setMessage("Start");
			mDlg.show();
		 
			super.onPreExecute();
		}


받은 URL 정보로 사이트에 접속한후 파일을 다운받는데 InputStream 으로 연후 OutputStream 으로 해당하는 파일을 바이트로 읽어 sdcard 에 저장한다.

현재는 이름이 정해져 있다.

 
		@Override
		protected String doInBackground(String... params) {
		 
			int count = 0;
			 
			try {
				Thread.sleep(100);
				URL url = new URL(params[0].toString());
				URLConnection conexion = url.openConnection();
				conexion.connect();
		 
				int lenghtOfFile = conexion.getContentLength();
				Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
		 
				InputStream input = new BufferedInputStream(url.openStream());
				OutputStream output = new FileOutputStream("/sdcard/Downloadtest.jpg");
		 
				byte data[] = new byte[1024];
		 
				long total = 0;				
				int progress = 0;
		 
				while ((count = input.read(data)) != -1) {
					total += count;

					int progress_temp = (int) total * 100 / lenghtOfFile;

					// 작업이 진행되면서 호출하며 화면의 업그레이드를 담당하게 된다
					publishProgress("progress", String.valueOf(progress_temp),"다운중입니다....");
					
					if (progress_temp % 10 == 0 && progress != progress_temp) {
						progress = progress_temp;
					}

					output.write(data, 0, count);
				}
		 
				output.flush();
				output.close();
				input.close();				 
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		 
			// 수행이 끝나고 리턴하는 값은 다음에 수행될 onProgressUpdate 의 파라미터가 된다
			return null;
		}
		


실시간으로 다운받은 진행 사항을 업데이트 한다.
 
		@Override
		protected void onProgressUpdate(String... progress) {
			if (progress[0].equals("progress")) {
				mDlg.setProgress(Integer.parseInt(progress[1]));
				mDlg.setMessage(progress[2]);
			} else if (progress[0].equals("max")) {
				mDlg.setMax(Integer.parseInt(progress[1]));
			}
		}
		


doInBackground 함수가 종료되었다면 다음 함수가 호출되는데 여기에서 프로그레시브바를 종료 한다.
 
		@SuppressWarnings("deprecation")
		@Override
		protected void onPostExecute(String unused) {
			mDlg.dismiss();
			 
		}
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.