13 thg 3, 2012

Download File dùng AsyncTask trong Android và cập nhật giá trị lên Progress Bar.

Để làm việc với lớp AsyncTask trong Android chúng ta làm như sau :
1. Tạo ra 1 lớp kế thừa từ class AsyncTask.

public class DownloadFile extends AsyncTask<String, Integer, String>

2. Sau đó implement các phương thức sau :

protected String doInBackground(String... params)
Method nhận dữ liệu về và write dữ liệu xuống file với params là 1 array URL truyền vào.

protected void onPostExecute(String result)
Method xử lý khi download file thành công.

protected void onProgressUpdate(Integer... values)
Method cập nhật dữ liệu lên giao diện. Progress bar là 1 ví dụ.

File DownloadActivity.java


/**
 *
 */
package com.csccom.luatle.main;

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

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * @author ADMIN
 *
 */
public class DownloadActivity extends Activity {

private ListView mLVChapter;
String[] mArrChapter = { "Chapter 1 - Tap 1", "Chapter 2 - Tap 1",
"Chapter 3 - Tap 1" };
private AlertDialog.Builder builder;
private ProgressDialog mProgressDialog;
private File file;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.download);
mLVChapter = (ListView) findViewById(R.id.download_lv);
file = new File("/sdcard/chapter1.zip");
createAlDiaglog();

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mArrChapter);
mLVChapter.setAdapter(adapter);

mLVChapter.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> adapter, View view,
int position, long id) {
// TODO Auto-generated method stub
if (builder != null) {
builder.show();

}
}
});

}

public void createAlDiaglog() {
final String itemDownload[] = { "Download", "Detail" };
Log.i("TTTH", "Clicked on Item Chapter download");
builder = new AlertDialog.Builder(this);
builder.setTitle("Download chapter ");
builder.setIcon(R.drawable.download);
builder.setItems(itemDownload, new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
mProgressDialog = new ProgressDialog(DownloadActivity.this);
mProgressDialog.setMessage("Please wait");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog
.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute("http://205.196.122.18/haspakvn9ojg/1r8ai3979wnoab7/doremon.zip");
mProgressDialog.show();
}
});

}

public class DownloadFile extends AsyncTask<String, Integer, String> {

@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
int count;
try {
URL url = new URL(params[0]);
URLConnection conn = url.openConnection();
conn.connect();
int lenghtOfFile = conn.getContentLength();

// Download file
InputStream input = new BufferedInputStream(url.openStream());

OutputStream output = new FileOutputStream(file);

byte data[] = new byte[1024];

long total = 0;

while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int) (total * 100 / lenghtOfFile));
output.write(data, 0, count);
}

output.flush();
output.close();
input.close();
} catch (Exception e) {
// TODO: handle exception

}
return null;

}

@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
mProgressDialog.dismiss();
Intent in = new Intent(getApplicationContext(),
ReadComicActivity.class);
in.putExtra("path", file.getPath());
startActivity(in);

}

@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
mProgressDialog.setProgress(values[0]);

}

}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();

}
}



3 nhận xét:

  1. Thanks ! Bài viết hay và rõ ràng lắm.
    gửi cho mình project toàn bộ bài này được không! mình mới làm quen chưa biết nhìu ! đang cần để làm đồ án.
    cảm ơn !
    email: trinhphuochoang@gmail.com

    Trả lờiXóa
  2. Bạn ơi cho mình xin cái project này được ko. mình cũng như bạn jojo mới học về android lại tự học nữa lên hơi khó.
    email: nguyenducduyet@gmail.com
    thank bạn nhiều nhé

    Trả lờiXóa
  3. Bạn xem trong bài viết http://jad177.blogspot.com/2012/02/oc-truyen-tranh-tren-android-source.html
    Phần download truyện tranh từ trên mạng về mình có làm phần này. Thân.

    Trả lờiXóa

Bản beta đầu tiên

Sau 6 tháng cả team cặm cụi làm việc điên cuồng, bản alpha cũng được giới thiệu ra toàn bộ công ty và được testing nội bộ công ty mà thôi. ...