안드로이드(android) 프로그레시브바를 이용한 파일 다운로드 구현 |
개발환경 : window 7 64bit, Eclipse Kepler, Android 4.2.2 |
인터넷이나 특정장소에서 파일을 다운받고자 할 때 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; while ((count = input.read(data)) != -1) { total += count; publishProgress("" + (int) ((total * 100) / lenghtOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); // 작업이 진행되면서 호출하며 화면의 업그레이드를 담당하게 된다 //publishProgress("progress", 1, "Task " + 1 + " number"); } 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(); }
3. 진행되는 화면과 전체 프로젝트 소스 |
전체 프로젝트 소스 : SampleProgress.zip
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) TextView 에 Html 표현하기 (0) | 2014.03.20 |
---|---|
안드로이드(android) GoogleMap 지도위에 도형이미지 그리기 (3) | 2014.03.15 |
안드로이드(android) GoogleMap 구현시 각종 표시 유형에 대해 알아본다 (0) | 2014.03.13 |
안드로이드(Android) 맵구현시 해당하는 이벤트 구현 예제 (1) | 2014.03.08 |
안드로이드(Android) 에서 제공하는 시간위젯 TimePicker 사용법 (0) | 2014.03.02 |
안드로이드(Android) 컴퓨터와 연결하여 화면 캡쳐하기 (0) | 2014.02.22 |
안드로이드(Android) 에서 MapView 를 이용해 구글맵 구현하기 (5) | 2014.02.19 |
안드로이드(Android) Map 구현시 클릭이벤트로 화면좌표와 위도경도값 가져오기 (6) | 2014.02.18 |