您的位置:首页 > 移动开发 > Android开发

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>


效果图:



点击一下,第一个按钮,第一个进度条会显示,在点击第二个,

第二个进度条也会显示出来.项目中将进度值给我们的进度

条就可以了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息