android多线程下载——--显示进度条,断点下载—--—(Demo)

Android ListView 多条目动态更新进度 使用Handler callback 接口 安卓ListView,有时会有这样的需求: 阅读详情

一:在线程下载的同时显示进度条,如图效果显示 :(本次测试使用了三个线程进行下载,所以有三个显示进度条)


二.实现的代码如下:

1.布局代码:(我已经将下载的路径写死了,自己灵活变动一下)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="http://192.168.1.109/kugou.exe" />

    <Button
        android:id="@+id/bt_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="download"
        android:text="download" />

    <ProgressBar
        android:id="@+id/pb_01"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />

    <ProgressBar
        android:id="@+id/pb_02"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />

    <ProgressBar
        android:id="@+id/pb_03"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />


</LinearLayout>

2.Activity的实现代码:

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    EditText et_url;

    ProgressBar pb_01;
    ProgressBar pb_02;
    ProgressBar pb_03;

    // 设置线程的数量为3
    private final static int THRED_COUNT = 3;
    final static String path = "http://192.168.1.109/kugou.exe";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_url = (EditText) findViewById(R.id.et_url);
        pb_01 = (ProgressBar) findViewById(R.id.pb_01);
        pb_02 = (ProgressBar) findViewById(R.id.pb_02);
        pb_03 = (ProgressBar) findViewById(R.id.pb_03);


    }

    //点击下载事件
    public void download(View view) {
        final String et_path = et_url.getText().toString().trim();
        if (TextUtils.isEmpty(et_path)) {
            Toast.makeText(this, "地址不能为空", Toast.LENGTH_SHORT).show();
            return;
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 创建三个线程进行多线程的下载资源文件
                try {
                    URL url = new URL(path);
                    // 1.获取文件资源的连接
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    // 2.获取服务器资源文件的大小
                    int length = conn.getContentLength();

                    //3.在本地生成与之一样的文件,使用随机流
                    RandomAccessFile raf = new RandomAccessFile(getFilename(), "rw");
                    //设置文件的长度
                    raf.setLength(length);

                    //4.开始划分每一个线程从什么位置下载到什么位置
                    int blockSize = length / THRED_COUNT;

                    //5.开启3个线程进行下载

                    for (int threadId = 0; threadId < THRED_COUNT; threadId++) {

                        //每个线程的下载开始位置
                        int startIndex = threadId * blockSize;

                        //线程下载的结束位置
                        int endIndex = (threadId + 1) * blockSize - 1;

                        //如果是最后一个线程,让这个线程执行后面剩余的文字资源
                        if (threadId == THRED_COUNT) {
                            endIndex = length - 1;
                        }

                        //开始线程去下载,并传递进去每一个线程下载的起始位置

                        new Downloader(threadId, startIndex, endIndex).start();
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }).start();


    }

    class Downloader extends Thread {
        private int startIndex;
        private int endIndex;
        private int threadId;
        private int currentPosition;

        public Downloader(int threadId, int startIndex, int endIndex) {
            this.startIndex = startIndex;
            this.endIndex = endIndex;
            this.threadId = threadId;
            currentPosition = startIndex;
            System.out.println("线程" + threadId + "-下载的位置从:" + startIndex + " ---" + endIndex);
        }

        @Override
        public void run() {
            try {
                //先找到之前记录好的位置信息
                File file = new File(getFiledir()+threadId + ".position");

                //判断以前曾经下载过文件,这个时候必须读取里里面的位置信息
                //(断点下载的方式:就是记录每次下载之后的位置,并实时保存到硬盘中,所以使用到了随机流进行实时写出断点下载的位置文件信息)
                if (file.exists() && file.length() > 0) {
                    FileInputStream fis = new FileInputStream(file);
                    BufferedReader bReader = new BufferedReader(new InputStreamReader(fis));
                    //读取线程曾经下载到的位置
                    currentPosition = Integer.parseInt(bReader.readLine());
                    System.out.println("以前有下载过文件--" + threadId + "--从" + currentPosition + "开始下载");
                    bReader.close();
                    fis.close();

                } else {
                    System.out.println("以前没有下载过文件,从头开始下载------");
                }

                URL url = new URL(path);

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                //conn.getInputStream()//获取这个资源对应的所有输入流
                //为了实现每一线程下载的东西都是固有的位置,所以必须告诉服务器,每一个线程从什么位置开始下载

                //设置线程下载资源的位置
                conn.setRequestProperty("Range", "bytes:" + currentPosition + "-" + endIndex);

                //获取线程访问返回的状态码    线程下载返回的是206
                int code = conn.getResponseCode();

                if (206 == code) {
                    InputStream in = conn.getInputStream();
                    //写文件的时候要注意,因为已经规定了每一个线程从什么位置开始下载,所以
                    //写数据的时候必须从指定位置开始写入
                    RandomAccessFile raf = new RandomAccessFile(getFilename(), "rw");
                    raf.seek(currentPosition);


                    byte[] buffer = new byte[1024];
                    int len = 0;
                    while ((len = in.read(buffer)) != -1) {
                        raf.write(buffer, 0, len);

                        //这几必须写在上面这句语句后面,不然会数据混乱问题出现问题
                        currentPosition += len;

                        //必须使用随机流进行读写现在下载位置的配置信息,不然会出现各种问题,(主要是硬盘的缓存问题)
                        RandomAccessFile fos = new RandomAccessFile(getFiledir()+threadId + ".position", "rwd");
                        fos.write((currentPosition + "").getBytes());
                        fos.close();


                        //进度条显示
                        if(threadId == 0){
                            pb_01.setMax(endIndex-startIndex);
                            pb_01.setProgress(currentPosition-startIndex);
                        }else if(threadId == 1){
                            pb_02.setMax(endIndex-startIndex);
                            pb_02.setProgress(currentPosition-startIndex);
                        }else if(threadId == 2){
                            pb_03.setMax(endIndex-startIndex);
                            pb_03.setProgress(currentPosition-startIndex);
                        }
                    }
                    System.out.println("线程" + threadId + "--已经下载结束了。。");
                    //下载完成之后,要删除(断点下载的配置文件.position)
                    //如果存在断点配置.position文件,将其删除
                    file.delete();

                    raf.close();
                    in.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    //获取路径中的文件名
    private static String getFilename() {
        String filedir = path.substring(path.lastIndexOf("/") + 1);
        File sdcard = Environment.getExternalStorageDirectory();
        Log.i(TAG, sdcard.getPath()+"/" + filedir);
        return sdcard.getPath()+"/" + filedir;
    }
    
    //获取路径中的文件名
    private static String getFiledir() {
        File sdcard = Environment.getExternalStorageDirectory();
        return sdcard.getPath() + "/" ;
    }

}



ListView中 局部刷新Item 实现下载进度条局部更新 问题引入: demo中需做个下载下载管理界面。同时只能下载一个任务,但是下载队列可以有多个下载任务。 当更新当前正在下载的任务的时候,使用 notifyDataSetChanged();方法会使整个页面都会刷新。 而且进度更新比较频繁,这就造成了内存的消耗和页面卡顿(在进度更新很频繁的情况),笔者甚至出现了卡住页面无法进行操作的情况。 所以想到了能不能局部刷新某个Item。也查了下资料, 阅读详情

相关推荐

android Listview显示多任务下载效果

在Listview显示多任务下载效果。可以中途停止类似360手机助手

Android多文件下载时多个进度条同时更新

Android多文件下载时多个进度条同时更新 ONE Goal,ONE Passion! 概述:多文件下载时,我们使用各种Xutils.Afinal,okhttp等框架都能直接使用去实现.可是如果多文件下载时,在listview中显示多个进度条的问题,又该如何去解决呢? 多文件多进度条显示遇到的问题:1,由于多文件下载时,都是在onLoading

fengltxx的博客 9546

android多任务下载显示Demo

用一个随机数模拟的下载速度,用一个Button可以获取所有下载任务的进度,如果想做显示,即可做一个线程循环调用这个Button所做的处理,用Handler更新即可!

Android 多个任务下载进度条显示%,Android下载多个文件时的进度条

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import java.uti...

weixin_42134554的博客 400

android ListView嵌套ProgressButton更新进度条

最近在做项目开发的时候,遇到listview中嵌套下载进度条。点击下载是的时候,进度条更新顺序混乱 解决办法如下: //设置进度条显示的百分比 public void publishProgress(final int positionInAdapter, final float progress) { if (positionInAdapter >= listView

270

Android 多线程断点下载project总结

Android断点续传下载详解

youngwm的专栏 1732

Android带通知栏操作多页面同步暂停支持多任务多线程断点下载demo

最近项目需要一个下载模块,要求多任务多线程断点下载还要通知栏提示,网上找了很多都没合适的,后面下了xutil做 成了这个demo希望可以给有同样需求的朋友一个参考,这个是我做项目前的测试demo所有有些细节可能没有完善,不过 大致功能还是可以实现的,有什么不足还希望大家指出,一起学习一起进步! 在xUtil基础上修改,支持多任务多线程断点下载,同时通知栏显示不卡顿,多个activity切

u012399891的博客 3706

第一步:写一个带进度条下载文件的小Demo

为了实现“多线程多文件断点续传下载”,我们先从最基本的入手:实现一个下载文件的功能 直接从代码入手开始介绍,该Demo只有一个Activity,其布局如下: 图片看起来貌似有点不大清楚。。 很简单的一个布局,用来显示下载文件名的TextView,一个显示进度的ProgressBar,一个开始下载的Button,一个暂停下载的Button(这个在本文还没用到)

bf23456的专栏 2531

安卓学习笔记6——多线程下载

安卓学习笔记6——多线程下载器一、项目整体介绍1、项目逻辑流程2、项目目的:二、项目代码三、遇到的问题 一、项目整体介绍 使用HttpUrlConnection与服务器建立连接,获取文件长度,开多个线程下载资源,使用RandomAccessFile写入文件; 本项目没有使用高大上的OKhttp 1、项目逻辑流程 2、项目目的: 我把这个小demo写在简历中,有两次面试都问道为什么采用多线程下载,...

qq_34782535的博客 572

断点续传和多线程下载()

最近在学习Android中的

Alone_SLFly的专栏 898

Android-OkhttpDownloader一个okhttp的多线程下载

OkhttpDownloader 一个okhttp的多线程下载

安卓Android多阶段进度条progress bar附带动画效果

还在为美工设计出的进度条而发愁吗,安卓Android多阶段进度条progress bar附带动画效果。效果炫起来。

安卓系统下的多线程断点下载实现

最近研究多线程下载,写了个demo,整理下来,也许会对别人有帮助。 多线程下载的话一般开启两到三个线程吧。如果线程太多的话时间会浪费在线程的切换上,倒是浪费了大把的时间。线程多了也不是一件好事。 原理的话看我的另一篇博文,事实上是将代码移植到了安卓系统上。java实现的多线程下载demopublic class MainActivity extends Activity { protec

BIGBurning 1330

android多线程断点下载

多线程断电xia下载,通过设置线程的数量,动态获取下载文件线程的个数,这是本人用于练习所写demo,注释很详细,用于初学者参考使用。 MainActivity.java页面   package com.dahui.download; import java.io.BufferedReader; import java.io.File; import java.io.FileInputSt...

qq_38993002的博客 242

告别卡顿!Android高效下载进度条实现:基于FileDownloader的UI优化方案

你是否还在为Android应用中的下载进度条卡顿问题烦恼?用户点击下载后,进度条要么长时间不动,要么突然跳变,严重影响用户体验。本文将基于FileDownloader引擎,提供一套完整的下载进度条实现方案,解决进度更新不流畅、UI线程阻塞等常见问题,让你的应用下载体验媲美专业级应用。 读完本文你将学到: - 如何使用FileDownloader实现流畅的进度更新 - 避免进度条卡顿的关键技术点 ...

gitblog_00207的博客 506

Android多线程下载断点续传

本文在上篇JavaSE多线程下载断点续传>的基础上,再Android中实现多线程下载断点续传。其实,核心代码是完全一致的,不过在Android中添加了下载进度显示,设计到Android中的消息机制,多线程之间的通信,这些知识网上一搜一箩筐,在此就不再赘述了,直接上代码,代码中有详细的注释。 main.xml <LinearLayout xmlns:android="http://sche

KingW 537

android listview多线程刷新各自的进度,Android多线程中使用Handler更新ListView控件数据...

Android应用开发中,免不了涉及耗时的操作,比如网络数据更新等。如果直接在主线程中完成,不给出适当的提示信息,则长时间的等待会给用户一个错觉:程序死了!所以,针对耗时的操作,使用多线程操作结合ProgressDialog进度条对话框来实现就显得非常的必要了。假设MainActivity中有一个名为list的ListView布局,点击按钮后执行DownloadData() 方法开始下载数据。/...

weixin_28894541的博客 715

Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

当我们学完java中多线程下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.H

国旭 的专栏 1万+
上一篇: java多线程下载服务器资源文件-------(demo)支持断点下载
下一篇: Android传统HTTP请求get----post方式提交数据(包含乱码问题)
未来幻想者
博客等级 码龄13年 2粉丝 32原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值