Android多文件下载时多个进度条同时更新
2016-06-02 22:11
691 查看
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>
效果图:
点击一下,第一个按钮,第一个进度条会显示,在点击第二个,
第二个进度条也会显示出来.项目中将进度值给我们的进度
条就可以了.
相关文章推荐
- 多个文件开启固定线程等待下载--java实现
- Struts2多文件下载
- linux命令行下的ftp 多文件下载和目录下载
- 百度云的高速下载技巧系列3---批量文件下载工具pandownload v1.3.5版 (PC)
- 批量下载文件
- 微信小程序之多文件下载的简单封装示例
- Android Transition 和 Activity & Fragment Transition详解(二)--Android Transition框架介绍
- 欢迎使用CSDN-markdown编辑器
- Android Accessibility(辅助功能) --实现Android应用自动安装、卸载、强行停止
- Android 基础总结:( 十四)Handler详解(上)
- 深入理解Android消息处理系统——Looper、Handler、Thread
- android 获取坐标的方法
- JamesMusic浅读--------7,音乐列表界面显示
- android 换肤(2)——插件式无缝换肤(解析鸿洋大神的换肤流程)
- Bundle
- Android Intent demo
- android socket 通信(2)--传文件
- Android从数据库中获取所有的文件
- Android 基础总结:( 十三)AsyncTask
- 安卓初识基本控件_Dialog对话框