iVPS 가상서버호스팅

[안드로이드] AsyncTask 파일 다운로드 예제 본문

안드로이드

[안드로이드] AsyncTask 파일 다운로드 예제

iVPS 영은파더♥ 2019. 4. 24. 17:15

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 에서 구현하면 됩니다.

 

Trackback : 0 | Comments : 0
댓글쓰기 폼