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. android竖向进度条简单实现
  3. Android Studio ADB响应失败解决方法
  4. android保持在休眠时,后台程序继续运行(让程序获取设备电源锁)
  5. Unity 调用 Android Native 方法(一) 获得Android系统音量
  6. Mac 下面,添加android adb命令(一般环境变量的添加方法)
  7. Android软键盘挡住输入框的问题及解决方法
  8. Android 摄像头后台采集

随机推荐

  1. Android(安卓)复习笔记之图解TextView类
  2. android:configChanges="orientation|key
  3. Android各个版本API的区别
  4. [Android(安卓)Pro] 注册 Google Play 开
  5. 2月收藏
  6. Android控件及API说明(二)
  7. Android(安卓)浅谈MatrixCursor
  8. Android(安卓)Studio - 第四十四期 倒计
  9. SJ64 拿起工具(Android(安卓)Studio)开始造
  10. Android(安卓)app实现重启