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);        }    }}

Ref:详解Android中AsyncTask的使用

更多相关文章

  1. android EditText 不自动弹出键盘的方法
  2. Flutter Android启动源码分析(一)
  3. Android文件存储总结
  4. Android生命周期
  5. Android(安卓)Timer(计时器)
  6. (收集)ListView中常用属性
  7. Android下ContentProvider 学习总结
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android音乐播放器系列讲解之一
  2. 【Android(安卓)NDK 开发】Ubuntu 函数库
  3. Android(安卓)sdk 1.5 android工具的用法
  4. Android(安卓)常用开发术语
  5. 解决Fetching android sdk component inf
  6. Android(安卓)RelativeLayout
  7. Android(安卓)Studio 单刷《第一行代码》
  8. Android中RelativeLayout各个属性,例如:and
  9. Android系统简介
  10. Android(安卓)Studio导入Project的方法