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

来源:互联网 发布:手机幻灯片制作软件 编辑:程序博客网 时间:2024/06/07 17:11

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>

效果图:

这里写图片描述

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

1 0
原创粉丝点击