마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

파일 다운로드 progressBar

0 추천

앱 실행했을 때 최신버전이 있으면

최신버전을 받는 버튼을 클릭하게 됩니다.

그렇게되면 기존 UI위에 progressBar를 띄우고

100이 되게되면 gone 시킨 후에 설치하시겠습니까?

를 띄울라고 하는데요.

 

그래서 다운로드 쓰레드는 따로 띄웠습니다.

 

백그라운드에서 작업할게 아니라서 AsyckTask가 필요 없을거같구..(어싱크테스크가 뭔지 잘 모름..)

 

일단 이게 제 코드입니다.

현재는 버튼을 누르게 되면 sd카드로 다운로드만 이루어지는 상태구요

그 상태를 progressBar에 띄우고 싶습니다.

여기서 어떻게 더 해야 하는지.. 인터넷 예제 소스를 보고 해서..

필요 없는 부분은 무엇인지..

 

지적과 가르침좀 부탁드립니다.

 

public class MainActivity extends Activity {
	private ProgressDialog progressDialog;
	public static final int progressbarType = 0; 
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void mOnClick(View v) {
		ApkDownload apk = new ApkDownload();
		apk.start();
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case progressbarType:
			progressDialog = new ProgressDialog(this);
			progressDialog.setMessage("파일을 다운로드 중입니다. 잠시만 기다려 주십시오...");
			progressDialog.setIndeterminate(false);
			progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			progressDialog.setCancelable(true);
			progressDialog.show();
			return progressDialog;
		default:
			return null;
		}
	}
	
	 protected void onProgressUpdate(String... progress) {
		 progressDialog.setProgress(Integer.parseInt(progress[0]));
	   }
}

class ApkDownload extends Thread {
	
	public ApkDownload() {
		super();
	}

	public void run() {
		String apkName = "apk이름";
		
		try {
			URL url = new URL("http://apk경로/app/"+apkName+".apk");
			
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
			
			urlConnection.connect();
			
			File sdCardRoot = Environment.getExternalStorageDirectory();
			File file = new File(sdCardRoot, apkName+".apk");
			
			InputStream in = urlConnection.getInputStream();
			FileOutputStream fos = new FileOutputStream(file);

			int totalSize= urlConnection.getContentLength();
			int downloadedSize = 0;
			byte[] buffer = new byte[totalSize];
			int bufferLength = 0;
			
			while ((bufferLength = in.read(buffer)) > 0) {
				fos.write(buffer, 0, bufferLength);
				downloadedSize += bufferLength;
			}
			fos.close();

		} catch (MalformedURLException  e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

윤둥이 (4,560 포인트) 님이 2013년 5월 15일 질문
윤둥이님이 2013년 5월 15일 수정

1개의 답변

+1 추천
 
채택된 답변

http://stackoverflow.com/questions/5938198/file-download-progress-bar-in-android

class DownloadFileAsync extends AsyncTask<String, String, String> {
        private ProgressDialog mProgressDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(UrlTestActivity.this);
            mProgressDialog.setMessage("Downloading file..");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
        }

        @Override
        protected String doInBackground(String... aurl) {
            int count;
            try {

                for (int i = 0; i < 3; i++) {
                    URL url = new URL("http://nodeload.github.com/nexes/Android-File-Manager/zipball/master");
                    URLConnection conexion = url.openConnection();
                    conexion.connect();
                    int lenghtOfFile = conexion.getContentLength();
                    InputStream is = url.openStream();
                    File testDirectory = new File(Environment.getExternalStorageDirectory() + "/Folder");
                    if (!testDirectory.exists()) {
                        testDirectory.mkdir();
                    }
                    FileOutputStream fos = new FileOutputStream(testDirectory+ "/"+(i+100)+".zip");
                    byte data[] = new byte[1024];
                    long total = 0;
                    int progress = 0;
                    while ((count = is.read(data)) != -1) {
                        total += count;
                        int progress_temp = (int) total * 100 / lenghtOfFile;
                        publishProgress(""+ progress_temp);
                        if (progress_temp % 10 == 0 && progress != progress_temp) {
                            progress = progress_temp;
                        }
                        fos.write(data, 0, count);
                    }
                    is.close();
                    fos.close();
                }
            } catch (Exception e) {}
            return null;

        }
        protected void onProgressUpdate(String... progress) {
             Log.d("ANDRO_ASYNC",progress[0]);
             mProgressDialog.setProgress(Integer.parseInt(progress[0]));
        }

        @Override
        protected void onPostExecute(String unused) {
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        }
    }

 

aucd29 (218,390 포인트) 님이 2013년 5월 15일 답변
윤둥이님이 2013년 5월 15일 채택됨
이 코드를 메인엑티비티에서 호출할 때
new ProgressDialog(MainActivity.this) 하니까 안되는데..
어떻게해요?;;
DownloadFileAsync 를 생성할떄 Context를 인자로 같이 넣고 그걸로 만들면 됩니다
정안되면 getParent()하셔도 될겁니다
...