Android AsyncTask异步实现大文件下载

3 篇文章 0 订阅
1 篇文章 0 订阅

Android AsyncTask异步实现大文件下载

![异步下载显示图片](http://img.blog.csdn.net/20151114001557431)
public class Third extends Activity {
    private Button btn;
    private ImageView iv;
    private TextView textview;
    private Handler handlers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.download);
        btn = (Button) findViewById(R.id.btn);
        iv = (ImageView) findViewById(R.id.iv);
        textview = (TextView) findViewById(R.id.textview);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DownLoadImageTask imt = new DownLoadImageTask();
                imt.execute("http://img2.niutuku.com/desk/1208/0850/bizhi-0850-17120.jpg");//传一个网址
            }
        });
        handlers = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if(msg.what==0x001){
                    Log.e("---------------------", "" + msg.obj);
                    textview.setText(msg.obj.toString());

                }else if(msg.what==0x002){
                    Bitmap bitmap = (Bitmap) msg.obj;
                    iv.setImageBitmap(bitmap);

                }
            }
        };

    }

    /**
     * 完成图片下载的异步任务
     * @author Administrator
     *
     */
    class DownLoadImageTask
            extends AsyncTask<String, Integer, byte[]> {//参数含义:传进去的值;后台百分比;返回的结果
        private ProgressDialog progressDialog;//进度条
        private byte[] current = new byte[2 * 1024];//每次读到的字节数组
        private byte[] total;//下载图片后汇总的字节数组
        private boolean flag; //是否被取消

        //任务执行之前回调
        @Override
        protected void onPreExecute() {
            progressDialog = new ProgressDialog(Third.this);
            progressDialog.setMessage("正在操作中,请稍候……");
            progressDialog.setMax(100);//进度条最大值
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平样式
            progressDialog.setIndeterminate(false);//进度条的动画效果(有动画则无进度值)

            flag = true;
            //退出对话框事件
            progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    flag = false;
                }
            });
            progressDialog.show();
        }

        @Override
        protected  byte[] doInBackground(String... params) {//字符串数组
            try {
                //创建URL对象,用于访问网络资源
                URL url = new URL(params[0]);
                //获得HttpUrlConnection对象
                HttpURLConnection http = (HttpURLConnection) url.openConnection();
                //设置超时时间
                http.setConnectTimeout(5000);
                //获得总长度
                int length = http.getContentLength();
                Log.d("=======", length + "");
                //为total分配空间
                total = new byte[length];

                //开始读取数据
                int pointer = 0;//已用掉的索引
                InputStream is = http.getInputStream();
                int real = is.read(current); //读取当前批次的字节并保存到数组中
                while(flag && real > 0){
                    //如果读取到了字节,则保存到total中
                    for(int i = 0; i < real; i ++){
                        total[pointer + i] = current[i];
                    }
                    //指针向后移
                    pointer += real;
                    //计算进度
                    int progress = (int)((double)pointer / length * 100);//先计算出百分比在转换成整型
                    //更新进度
                    publishProgress(progress, pointer, length);
                    //继续读取下一批
                    real = is.read(current);
                }
                //关闭流对象
                is.close();
                //将获得的所有字节全部返回
                return total;
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        //更新进度条回调
        @Override
        protected void onProgressUpdate(Integer... values) {
            progressDialog.setMessage(
                    String.format("已读%d M, 共%d M",//字节为单位
                            values[1] / 1024 / 1024, values[2] / 1024 / 1024));//将values[1]赋给第一个%d,第二个同理

            progressDialog.setProgress(values[0]);//进度动态提示
            Message message001 = handlers.obtainMessage(0x001);
            message001.obj=values[0];
            handlers.sendMessage(message001);
        }

        //任务被取消时回调
        @Override
        protected void onCancelled() {
            super.onCancelled();
            Toast.makeText(getApplication(),"任务已取消",Toast.LENGTH_SHORT).show();
        }

        //任务结束后回调
        @Override
        protected void onPostExecute(byte[] result) {
            progressDialog.dismiss();//关闭对话框

            Bitmap bitmap = null;
            if(flag){
                //将获得的字节数组转换成Bitmap图片对象(在安卓中用位图显示图片)
                bitmap = BitmapFactory.decodeByteArray(
                        result, 0, result.length);
                //iv.setImageBitmap(bitmap);
                Message message002 = handlers.obtainMessage(0x002);
                message002.obj=bitmap;
                handlers.sendMessage(message002);
            }
            flag = false;

            //回收内存
            if(!flag && !bitmap.isRecycled()){
                //bitmap.recycle();
            }
        }
    }

}

download.xml文件:-----------------------------------

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_gravity="center_vertical|center_horizontal"
        android:id="@+id/progressbar"
        android:layout_width="200dp"
        android:layout_height="20dp" />

    <TextView
        android:textColor="#FF0000"
        android:id="@+id/textview"
        android:layout_below="@id/progressbar"
        android:gravity="center_horizontal"
        android:textSize="14dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@android:color/holo_blue_dark"
        android:text="下载图片"
        android:textColor="#FFFFFF" />

</RelativeLayout>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现音乐下载,你需要以下几个步骤: 1. 在AndroidManifest.xml中添加网络访问权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 创建一个异步任务类,下载音乐文件: ```java public class DownloadMusicTask extends AsyncTask<String, Integer, String> { private Context mContext; private ProgressDialog mProgressDialog; public DownloadMusicTask(Context context) { mContext = context; } @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog = new ProgressDialog(mContext); mProgressDialog.setMessage("正在下载,请稍候..."); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setMax(100); mProgressDialog.setCancelable(false); mProgressDialog.show(); } @Override protected String doInBackground(String... params) { String url = params[0]; String fileName = params[1]; File file = new File(Environment.getExternalStorageDirectory() + "/" + fileName); try { URL musicUrl = new URL(url); URLConnection connection = musicUrl.openConnection(); connection.connect(); int fileLength = connection.getContentLength(); InputStream input = new BufferedInputStream(musicUrl.openStream()); OutputStream output = new FileOutputStream(file); byte[] data = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { e.printStackTrace(); } return file.getAbsolutePath(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); mProgressDialog.setProgress(values[0]); } @Override protected void onPostExecute(String filePath) { super.onPostExecute(filePath); mProgressDialog.dismiss(); Toast.makeText(mContext, "下载完成,文件保存在" + filePath, Toast.LENGTH_LONG).show(); } } ``` 3. 在Activity中调用异步任务类: ```java String url = "http://example.com/music.mp3"; String fileName = "music.mp3"; DownloadMusicTask task = new DownloadMusicTask(this); task.execute(url, fileName); ``` 这样就可以实现音乐文件下载了。请注意,这里的文件保存路径默认为SD卡根目录。如果你需要保存到其他位置,请修改代码中的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值