Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

안드로이드(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

 

 

반응형
Posted by 녹두장군1
,