zoukankan      html  css  js  c++  java
  • 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("准备下载...
    ");
            }
    
            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 + "]" + "=>[下载完成]
    ";
                    }
                } 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] + "%]
    ");
            }
    
            //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的使用

  • 相关阅读:
    NSRunLoop的利用
    快速排序算法
    WebViewJavascriptBridge的暂时理解
    非常喜欢的一期《晓松奇谈》
    字符串正则替换replace第二个参数是函数的问题
    Model模型和Module模块的区别
    jQuery的extend方法的深层拷贝
    正则表达式学习记录
    select2初始化默认值
    增进编程语言学习速度的小技巧
  • 原文地址:https://www.cnblogs.com/ncore/p/4381384.html
Copyright © 2011-2022 走看看