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 에서 구현하면 됩니다.
'안드로이드' 카테고리의 다른 글
[안드로이드] Play 프로텍트에 의해 차단됨 해결 방법 (0) | 2019.05.08 |
---|---|
[안드로이드] 갤럭시 윈 루팅 방법 (0) | 2019.05.08 |
[안드로이드] Android Studio resource linking failed (0) | 2019.04.10 |
[안드로이드] Android 8.1 SDK 27 FCM PUSH 알림 문제 (0) | 2019.03.20 |
[안드로이드] FCM PHP 서버 PUSH (0) | 2019.03.08 |