安卓下载文件如何更新UI进度

以前写过几篇关于下载的文章,总的来说是以下几点:

1、维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task。以防止下载重复,并将信息保存至数据库。

2、下载线程Task继承自Runnable,使用RandomAccessFile来保证可以断点下载。

3、下载时使用ContentProvider的Observer进行通知UI或使用Listener监听器通知,当然也可以是BroadCast。

反编译过很多的apk,并查看下载模块,使用Listener比较多。该接口定义下载线程开始、更新、错误等等状态。

4、如何更新UI?肯定是Handler了。比如一个下载的列表,我以前使用Handler通知ListView.adapter.notifyDataChanged。

但是下载进度比较多,导致刷新页面比较频繁,基本上只要3个线程在跑,页面就会卡死了。

可以采用下面的方式

1)listview的item的进度、下载速度等需要及时的View,使用setTag("xxx")的方式添加tag,以方便更新。

2)需要更新时,如收到了通知,使用listview.findTag("xxx")的方式进行更新。这样比notifyDataChanged更加节省内存

附件是反编译某APK的源码。

时间: 2025-01-21 21:03:02

安卓下载文件如何更新UI进度的相关文章

安卓下载文件怎样更新UI进度

曾经写过几篇关于下载的文章.总的来说是下面几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task. 以防止下载反复.并将信息保存至数据库. 2.下载线程Task继承自Runnable,使用RandomAccessFile来保证能够断点下载. 3.下载时使用ContentProvider的Observer进行通知UI或使用Listener监听器通知,当然也能够是BroadCast. 反编译过非常多的apk.并查看下载模块,使用Liste

基于Android下载并解压Zip文件,更新UI简单帮助类

类似于:http://blog.csdn.net/jarlen/article/details/44794031 下载文件: /** * 下载文件 * * @param down_url * @param output * @param tmpDir */ private void download(String down_url, File output, File tmpDir) { InputStream inputStream = null; OutputStream outputStr

基于Android 下载文件时,更新UI简单帮助类

由于在项目开发时,有这样的简单需求,问谷歌,网络上也有好多Utils工具类,但是比较冗余.自己就简单的写了一个简单帮助类. /** * 下载文件,更新UI简单帮助类 * * @author jarlen * */ public class DownLoadHelper { private static final int DOWN_BEGIN = 0; private static final int DOWN_UPDATA = 1; private static final int DOWN_

recyclerView中多任务下载文件进度条更新的问题

在recyclerview或listview中进行下载时,由于条目复用等原因会导致下载的进度条更新错乱. 你可能觉得条目复用问题我解决过那么多次,加个tag了啥的就解决了不是. 有这个想法说明你没做过下载的处理.因为在下载的过程中,进度条是一直处于更新状态,所以传统的解觉条目复用的方式并不起作用. 解决方式有两种: 1.进度更新时把进度条进度存到bean中.然后在获取进度的循环中同步刷新adapter. 2.进度更新时把进度条进度存到bean中.写一个轮询刷新adapter.

Android中如何下载文件并显示下载进度

原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Service和使用DownloadManager. 一.使用AsyncTask并在进度对话框中显示下载进度 这种方式的优势是你可以在后台执行下载任务的同时,也可以更新UI(这里我们用progress bar来更新下载进度) 下面的代码是使用的例子 1 // declare the dialog as a

Winform实现多线程异步更新UI(进度及状体信息)

引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数据操作的应用上,需要使用多线程来处理这种情况.在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单.本文实现了用子线程去处理数据,并实时更新主线程的ui状态了.下面就开始一步步的去实现异步线程更新

Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度

在开发过程中,总会需要从网络上下载文件,有时候还需要将下载进度显示在下拉菜单中. 现在写了一个Demo,封装了AsyncTask下载文件和进度显示的代码,以后在做项目的时候能够直接进行使用. 效果图: 主界面只有一个按钮,比较简单: / layout / activity_main.xml : <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h

Winform实现多线程异步更新UI(进度及状态信息)

引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数据操作的应用上,需要使用多线程来处理这种情况.在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单.本文实现了用子线程去处理数据,并实时更新主线程的ui状态了.下面就开始一步步的去实现异步线程更新

小小一方士 C# Async\Await 之 上传/下载文件进度条实现原理

关于上传下载文件(图片等),涉及到UI进度条的显示,c#中 System.IProgress提供了相应的api. namespace System { // // 摘要: // 定义进度更新的提供程序. // // 类型参数: // T: // 进度更新值的类型.此类型参数是逆变.即可以使用指定的类型或派生程度更低的类型.有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变. public interface IProgress<in T> { // // 摘要: // 报告进度更新. //