Android AsyncTask Download
AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
activity_download_file.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/execute" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/download"/> <Button android:id="@+id/cancel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:enabled="false" android:visibility="gone" android:text="@string/cancel"/> <ProgressBar android:id="@+id/progress_bar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:progress="0" android:max="100" style="?android:attr/progressBarStyleHorizontal"/> <TextView android:id="@+id/txtResult" android:layout_width="fill_parent" android:textSize="20dp" android:layout_height="wrap_content"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="20dp" android:text="@string/doneList"/> <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/txtDoneList" android:textSize="20dp" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView> </LinearLayout>
DownloadFileActivity
package com.buzz.activity; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.support.v7.app.ActionBarActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import com.buzz.models.action; import com.buzz.utils.GlobalConst; public class DownloadFileActivity extends ActionBarActivity { static final String TAG = "ASYNC_TASK"; Button execute; Button cancel; ProgressBar progressBar; TextView txtResult; TextView txtDoneList; Map<String, MyTask> taskList; MyTask mTask; MyApplication myApp; int fileCounter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download_file); myApp = (MyApplication) getApplication(); taskList = new HashMap<String, MyTask>(); execute = (Button) findViewById(R.id.execute); execute.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txtDoneList.setText(""); taskList.clear(); //注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常 for (List<action> acList : myApp.actionList.values()) { for (action ac : acList) { taskList.put(ac.getServerpath(), new MyTask(ac.getClientpath(), ac.getFilename())); } } for (Map.Entry<String, MyTask> entry : taskList.entrySet()) { entry.getValue().execute(entry.getKey()); } execute.setEnabled(false); cancel.setEnabled(true); } }); cancel = (Button) findViewById(R.id.cancel); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //取消一个正在执行的任务,onCancelled方法将会被调用 mTask.cancel(true); } }); progressBar = (ProgressBar) findViewById(R.id.progress_bar); txtResult = (TextView) findViewById(R.id.txtResult); txtDoneList = (TextView) findViewById(R.id.txtDoneList); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_download_file, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement return super.onOptionsItemSelected(item); } private class MyTask extends AsyncTask<String, Integer, String> { //onPreExecute方法用于在执行后台任务前做一些UI操作 @Override protected void onPreExecute() { //Log.i(TAG, "onPreExecute() called"); txtResult.setText("准备下载...\n"); } private String clientPath; private String fileName; protected MyTask(String clientPath, String fileName) { this.clientPath = clientPath; this.fileName = fileName; } //doInBackground方法内部执行后台任务,不可在此方法内修改UI @Override protected String doInBackground(String... params) { //Log.i(TAG, "doInBackground(Params... params) called"); try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); long total = entity.getContentLength(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int count = 0; int length = -1; while ((length = is.read(buf)) != -1) { baos.write(buf, 0, length); count += length; //调用publishProgress公布进度,最后onProgressUpdate方法将被执行 publishProgress((int) ((count / (float) total) * 100)); //为了演示进度,休眠500毫秒 //Thread.sleep(500); } //保存文件 String filePath = GlobalConst.PATH_SDCARD + this.clientPath; String fileName = this.fileName; String saveTo = filePath + fileName; File file = new File(filePath); file.mkdirs(); file = null; file = new File(saveTo); file.createNewFile(); OutputStream outputStream = new FileOutputStream(file); outputStream.write(baos.toByteArray()); baos.close(); baos.flush(); outputStream.close(); outputStream.flush(); file = null; return "[" + this.fileName + "]" + "=>[下载完成]\n"; } } catch (Exception e) { //Log.i(TAG, e.getMessage()); } return null; } //onProgressUpdate方法用于更新进度信息 @Override protected void onProgressUpdate(Integer... progresses) { //Log.i(TAG, "onProgressUpdate(Progress... progresses) called"); progressBar.setProgress(progresses[0]); txtResult.setText("[" + this.fileName + "]" + "=>[下载中..." + progresses[0] + "%]\n"); } //onPostExecute方法用于在执行完后台任务后更新UI,显示结果 @Override protected void onPostExecute(String result) { //Log.i(TAG, "onPostExecute(Result result) called"); txtResult.setText(result); txtDoneList.append(result); fileCounter++; if (fileCounter == taskList.size()) { execute.setEnabled(true); cancel.setEnabled(false); } } //onCancelled方法用于在取消执行中的任务时更改UI @Override protected void onCancelled() { //Log.i(TAG, "onCancelled() called"); txtResult.setText("cancelled"); progressBar.setProgress(0); execute.setEnabled(true); cancel.setEnabled(false); } } }