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

ONE   Goal,ONE Passion!

概述:

多文件下载时,我们使用各种Xutils.Afinal,okhttp等框架都能直接使用去实现.可是如果多文件下载时,在listview中显示多个进度条的问题,又该如何去解决呢?


多文件多进度条显示遇到的问题:

1,由于多文件下载时,都是在onLoading(以xutils为例)中
获取实时的进度.如何保证每个文件的下载进度和当前文件
绑定到一起.

将当前文件和进度存入bean对象中.为了方便得到对象,我们把
对象存入map集合中.由于map集合的key不能相同,如果相同的
话会覆盖上一次的数据,所有我们在onLoading方法中,可以将             
bean,存入map中.保证我们的数据绑定到了一起.
map(文件1的名称,文件1存储数据的对象);

2,怎样将进度实时更新到listview的item上,而且不会出现进度
乱跳问题.

我们将存储数据的map作为数据源,当数据更新时,去更新adapter就可以了.

直接上代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ListView lv;
    Activity act;
    //URL地址
    public static final String URL = "http://gdown.baidu.com/data/wisegame/60288c8f92238775/FruitNinja_1809.apk";
    public static final String URL1 = "http://gdown.baidu.com/data/wisegame/60288c8f92238775/FruitNinja_1809.apk";  
    private Button btn_1;
    private Button btn_2;

    ArrayList<String> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        act = this;
      mList = new ArrayList<>();
  initView();

   }


// 存储 某个文件对应的下载数据
//String  某个文件的标识
//Bean   该文件的下载数据
    HashMap<String, Bean> map = new HashMap<>();
  /**
     * 下载文件
     *
     * @param URL 网络文件的URL地址
     * @param s   将文件保存的路径.这里直接保存在了sd卡下
     */
    private void downFile(final String URL, final String s) {

        mList.add(s);  
        //我这里为了保证下载,所以
        保存文件名,作为map的key.(这个s可以随意命名,
        只要能标识你下载的是哪个文件就行)
        HttpUtils http = new HttpUtils();
        HttpHandler handler = http.download(URL,
                s,
                true, // 如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。
                true, // 如果从请求返回信息中获取到文件名,下载完成后自动重命名。
                new RequestCallBack<File>() {

                    // 开始下载
                    @Override
                    public void onStart() {

                    }
                    //正在下载的 回调,此方法会在下载过程中多次调用.
                    @Override
                    public void onLoading(long total, long current, boolean isUploading) {


                        Bean bean = new Bean();
                        bean.setCurrent(current);
                        bean.setTotal(total);
                        bean.setUrl(s);

                        //将下载的文件名当做key,将当前文件的进度,以及总时长当做value存入map中.
                        //由于map中的key不可重复,所以我们将文件名作为key存入map中
                        map.put(s, bean);


                        //实时更新adapter.
                        adapter.notifyDataSetChanged();


                    }
                    //下载成功回调
                    @Override
                    public void onSuccess(ResponseInfo<File> responseInfo) {
                    }

                    //下载失败回调
                    @Override
                    public void onFailure(HttpException error, String msg) {
                    }
                });
    }


    private void initView() {
        lv = (ListView) findViewById(R.id.lv);


        btn_1 = (Button) findViewById(R.id.btn_1);
        btn_1.setOnClickListener(this);
        btn_2 = (Button) findViewById(R.id.btn_2);
        btn_2.setOnClickListener(this);

        adapter = new myAdapter();
        lv.setAdapter(adapter);

    }

    myAdapter adapter;

    class myAdapter extends BaseAdapter {

        @Override
        public int getCount() {
        //我们将map作为数据源
            if (map == null) {
                return 0;
            } else {

                return map.size();
            }

        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            viewHolder = null;
            if (convertView == null) {

                convertView = View.inflate(act, R.layout.layout_item, null);
                viewHolder = new ViewHolder(convertView);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }


            if (map != null && map.size() > 0) {

   //   mList.get(position)得到map的key          viewHolder.tv.setText(map.get(mList.get(position)).getCurrent() + "");
            }


            return convertView;
        }
    }

    ViewHolder viewHolder;

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_1:

                downFile(URL, "/sdcard/btnab-1.zip");
                break;
            case R.id.btn_2:

                downFile(URL1, "/sdcard/btnab-2.zip");
                break;
        }
    }

    public class ViewHolder {
        public View rootView;
        public TextView tv;

        public ViewHolder(View rootView) {
            this.rootView = rootView;
            this.tv = (TextView) rootView.findViewById(R.id.tv);
        }

    }


}

感觉这部分代码没什么技术含量就不分开写注释了.

存储文件下载数据的bean:
public class Bean {

    long current;  //下载进度
    long total;   //总时长
    String url;   //url  其实这个url可以不用

    public long getCurrent() {
        return current;
    }

    public void setCurrent(long current) {
        this.current = current;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<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">

    <Button
        android:id="@+id/btn_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="进度1" />

    <Button
        android:id="@+id/btn_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="进度2" />

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<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">

    <Button
        android:id="@+id/btn_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="进度1" />

    <Button
        android:id="@+id/btn_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="进度2" />

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

效果图:

Android一个文件夹下最多多少个文件 android多文件下载_ide

点击一下,第一个按钮,第一个进度条会显示,在点击第二个,
第二个进度条也会显示出来.项目中将进度值给我们的进度
条就可以了.