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 mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
act = this;
mList = new ArrayList<>();
initView();
}
// 存储 某个文件对应的下载数据
//String 某个文件的标识
//Bean 该文件的下载数据
HashMap 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() {
// 开始下载
@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 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);
}
}
}
感觉这部分代码没什么技术含量就不分开写注释了.
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;
}
}
<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>
<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>
点击一下,第一个按钮,第一个进度条会显示,在点击第二个,
第二个进度条也会显示出来.项目中将进度值给我们的进度
条就可以了.