URL 로 서버에 있는 파일을 AsyncTask 를 활용하여 비동기식으로 다운로드 하는 예제입니다.

 

DownloaderTask task = new DownloaderTask(url, filename); // 파일의 주소와 저장할 파일경로
task.execute(); // 다운로드 시작

task.cancel(true); // 다운로드 취소

package com.example.asyncdownload;

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

public class DownloaderTask extends AsyncTask<String, String, Boolean> {
	private String TAG = "DownloaderTask";
	public String fileUrl = null;
	public String filePath = null;
	public long fileSize = -1;
	public long downloadSize = 0;
	public Boolean downloadEnd = false;

	public DownloaderTask(String url, String file) {
		this.fileUrl = url;
		this.filePath = file;
	}

	protected Boolean doInBackground(String... params) {
		Log.i( TAG, "doInBackground" );
		Boolean result = false;
		InputStream input = null;
		OutputStream output = null;
		URLConnection connection = null;

		try {
			URL url = new URL( fileUrl );
			connection = url.openConnection();
			connection.connect();

			fileSize = connection.getContentLength();
			Log.i( TAG, "fileLength : " + fileSize+"");
			input = new BufferedInputStream(url.openStream(), 8192);
			File outputFile = new File( filePath );
			Log.i( TAG, "outputFile : " + outputFile+"");
			output = new FileOutputStream(outputFile);

			byte[] buffer = new byte[8192];
			for (int bytesRead; (bytesRead = input.read(buffer)) >= 0; ) {
				if(isCancelled()) {
					Log.i( TAG, "isCancelled : " + isCancelled()+"");
					break;
				}
				downloadSize += bytesRead;
				publishProgress(downloadSize + "");
				output.write(buffer, 0, bytesRead);
			}
			output.flush();
			output.close();
			input.close();
			if(isCancelled()) {
				if(outputFile.exists()) { // 다운로드 취소된 파일은 삭제
					outputFile.delete();
					Log.i( TAG, "outputFile.exists() : " + outputFile.exists()+"");
				}
				downloadEnd = true;
				result = false;
			} else {
				result = true;
			}
		} catch (IOException e) {
			e.printStackTrace();
			result = false;
		}

		return result;
	}

	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		Log.i( TAG, "onPreExecute" );
	}

	@Override
	protected void onPostExecute(Boolean aBoolean) {
		super.onPostExecute(aBoolean);
		if(fileSize == downloadSize) {
			downloadEnd = true;
		}
		Log.i( TAG, "onPostExecute" );
	}

	@Override
	protected void onProgressUpdate(String... values) {
		super.onProgressUpdate(values);
		long v = Long.parseLong(values[0]);
		//Log.i( TAG, "onProgressUpdate : " + v );
	}
}

  onPreExecute 제일 먼저 호출되는 함수
  doInBackground 실제 다운로드하는 루틴
  onProgressUpdate 다운로드 하면서 publishProgress 함수에 값을 넣으면 실행되는 함수
  onPostExecute 다운로드가 끝나면 호출되는 함수

 

프로그래스바는 호출하는 Activity 에서 구현하면 됩니다.

 

블로그 이미지

iVPS 영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

댓글을 달아 주세요