Listview+Service+download 更新不卡线程方法

安卓探究ListView+Adapter数据在工作线程中更新引发的crash以及解决方法(三) 第三部分 solution及测试   从上面的分析可以看出安卓希望的ListView+Adapter使用方式是更新数据,然后调用notifyDataSetChanged()触发重绘,整个过程在UI线程串行执行,框架逻辑会保证健壮可用。所以exception的描述也是说Make sure the content of your adapter is not modified from a b 阅读详情

方法:

要实现listview上进度条动态更新,一般我们可以采用2种方法:

1. 获得itemview对象,再获得其中的进度条等对象对其重新赋值

2. 通过更新数据源,再调用adapter的notifyDataSetChanged 方法




优劣:

第一种:能定位到item来更新。但是Adapter中的itemview是采用重用的方法,假如一个listview中一次能显示5个item,那么第6个item其实在重用第一个item,这样获得获得的itemview对象并不准确。

第二种:更新数据源,通过数据源中position下标与getView中的下标绑定,这样更新数据就能准确到指定的item。但是频繁调用getView方法,容易造成ui阻塞.




结合:

1. 拿到需要更新的数据源下表pos

2. 判断pos是否在listview的显示中

3. 在显示中则获得itemView对象

4. 更新对应的itemview对象数据



代码:

 1.获得pos是否在显示的listview中 , 及更新数据

 int firstVisibleRow = listview.getFirstVisiblePosition() -1;
                        int lasVisibleRow = listview.getLastVisiblePosition();
                        if(pos >= firstVisibleRow && pos<= lasVisibleRow){
                            View view = (View) listview.getChildAt(pos - firstVisibleRow);
                            ViewHolder holder = new ViewHolder();
                            holder.progressBar = (ProgressBar) view.findViewById(R.id.downloadPro_list_item);
                            holder.percentTv = (TextView)view.findViewById(R.id.percentTv_list_item);
                            holder.downloadImgBn = (ImageButton)view.findViewById(R.id.download_list_item);
                            holder.svvdTv = (TextView)view.findViewById(R.id.cargo_operation_list_svvd);
                            holder.portTv =(TextView)view.findViewById(R.id.cargo_operation_list_port);
                            holder.terminalTv = (TextView)view.findViewById(R.id.cargo_operation_list_terminal);
                            holder.etaTv = (TextView)view.findViewById(R.id.cargo_operation_list_eta);
                            updateUI(downloadInfo , holder );
                        }


优化:

1.可以通过修改发送handler的频率来进行优化

if(mesenger != null ){
            try {
                if((System.currentTimeMillis() - lastUpdatedTime > SEND_UPDATE_TIME)
                        || per >=100 || error!= NO_ERROR){
                    downloadInfo.setPer(getPer());
                    downloadInfo.setError(getError());
                    Message msg = Message.obtain();
                    msg.what = CargoOperationDownloadAdapter.UPDATE_UI;
                    Bundle bundle = new Bundle();
                    bundle.putSerializable("DownloadInfo" , downloadInfo);
                    msg.setData(bundle);
                    mesenger.send(msg);
                    lastUpdatedTime = System.currentTimeMillis();
                }
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }


Windows本地部署Qwen3.5:0.8b:Ollama一键运行实战指南 大语言模型(LLM)本地化部署正成为开发者与企业提升数据安全、降低API成本的关键路径。其核心原理在于将模型推理引擎与硬件加速层(如DirectML、CUDA)深度耦合,实现低延迟、高兼容的端侧运行。技术价值体现在免依赖、轻量化、跨显卡兼容——尤其适合Windows环境下的边缘计算、离线办公与快速原型验证。典型应用场景包括笔记本AI助手、工业终端日志分析、企业内网文档摘要等。本文聚焦Qwen3.5:0.8b这一高性价比中文小模型,结合Ollama原生Windows方案,详解零基础安装、DirectML加速适 阅读详情

相关推荐

vLLM部署Llama系列大模型实战指南

大语言模型推理引擎是支撑私有化AI服务的核心基础设施,其性能直接决定低延迟、高吞吐与显存效率。vLLM凭借PagedAttention内存管理与Continuous Batching动态批处理技术,显著提升KV Cache利用率和请求吞吐能力,已成为Llama、Qwen等Decoder-only架构模型的首选推理框架。相比transformers静态批处理易OOM、llama.cpp CPU推理延迟抖动大等局限,vLLM在A10/A100等主流GPU上实现实测128+ QPS与亚秒级P99延迟,同时原生兼容

anwenzhao0749的博客 481

C#子线程中更新Listview内容(UI更新)

C#子线程中更新Listview内容(UI更新) 前言 Listview等控件内容的更新,在主线程中只需直接进行操作,但是在子线程中,直接操作就会报错。其实,不止C#中有这个现象,安卓中也有同样的现象。 这时候,可以借助delegate完成。 提示:以下是本篇文章正文内容,下面案例可供参考 一、delegate是什么? 示例:delegate委托是一个对方法进行引用的类型,当创建一个委托,也就创建一个引用方法的变量。 二、使用步骤 public delegate void UpdateStatus.

bianhu3124的博客 3440

第二次作业——Service、Listview与ACtivity参数传递

此代码为武汉理工大学秦珀石老师布置的武汉理工大学秦珀石第二次作业——Service、Listview与ACtivity参数传递,详情请戳:http://blog.youkuaiyun.com/qq347198688/article/details/52914407

用Python自动录制B站直播学习课程(附完整源码与防断流技巧)

本文详细介绍了如何使用Python自动化录制B站直播学习课程,涵盖M3U8流媒体协议解析、核心功能实现、稳定性增强与异常处理等关键技术。通过完整源码与防断流技巧,帮助开发者高效获取直播内容,适用于在线教育、技能培训等场景。

weixin_30263073的博客 381

带隙基准电路设计实战:从HSPICE仿真到Virtuoso版图全流程解析

在模拟集成电路设计中,基准电压源是确保系统精度与稳定性的核心模块。其基本原理在于巧妙结合具有正、负温度系数的电压,通过加权求和实现近似零温度系数的稳定输出,这一特性对于高精度数据转换器、电源管理芯片等至关重要。从工程实践角度,利用HSPICE进行深入的直流工作点、温度扫描和工艺角仿真,是验证电路性能、优化温度系数和电源抑制比的关键步骤。而借助Cadence Virtuoso进行版图实现时,必须重点关注电阻与BJT的匹配布局、敏感节点的保护以及电源完整性设计,以确保设计意图在硅片上得以准确呈现。通过完整的从前

weixin_29181861的博客 287

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 409

Java嵌套类深度解析:从内存模型到设计模式应用

嵌套类是Java面向对象编程中的重要特性,通过在类内部定义另一个类实现逻辑封装。其核心原理涉及访问控制、隐式引用和闭包机制,分为静态成员类、非静态成员类、匿名类和局部类四种类型。在Android开发中,Handler等组件的内存泄漏问题常源于对嵌套类引用机制的理解不足。合理使用嵌套类能提升代码内聚性,实现迭代器、策略等设计模式,特别适合处理回调逻辑和复杂数据结构。现代Java中,Lambda表达式和Record类为嵌套类提供了更多替代方案,但理解其底层字节码实现和内存模型仍是优化性能的关键。

weixin_34050519的博客 389

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 237

.NET Framework 1.0到4.0演进中的真实技术契约与迁移避坑指南

.NET Framework 是 Windows 平台企业级应用的底层运行基石,其核心由 CLR 运行时、BCL 类库和配置模型共同构成。从 1.0 到 4.0 的演进并非简单功能叠加,而是经历了四次底层契约重写:泛型引入重构 JIT 行为、CAS 安全模型确立权限边界、WCF/WPF 等技术整合带来跨组件互操作约束,以及 CLR 4.0 的并行运行时机制。这些变更深刻影响着程序集加载、ViewState 序列化、WCF 配置兼容性与 GAC 版本共存等关键环节。尤其在遗留系统迁移中,.NET Framew

416

ERA5 hourly data批量下载与cdo处理(一)

本篇文章主要介绍了ERA数据的批量下载

qq_40511689的博客 3872

保姆级教程:用ROS2 Humble和激光雷达,5分钟搞定机器人避障(附Python代码)

本文提供了一份详细的ROS2 Humble激光雷达避障实战指南,帮助开发者快速实现机器人避障功能。通过环境配置、硬件连接和Python代码实现,5分钟内即可让机器人自主避开障碍物。文章还涵盖了参数调优、常见问题排查及进阶优化技巧,适合机器人开发初学者和进阶用户。

weixin_42528902的博客 342

DownloadManager之DownloadService浅析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33797791的博客 1236

大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略

本篇文章是《Spring AI实战》专栏的第一篇开发入门文章,我们将借助一个完整的OpenAI聊天应用示例,详细介绍如何运用Spring Boot和Spring AI快速搭建一个支持OpenAI API的聊天服务,全面涵盖基础对话、流式对话、多提供商配置等核心功能。

寻道AI,探索AI无限可能! 6869

关于多线程下动态加载ListView数据源的注意事项

关于listview更新数据和界面不同步时出现的问题

MrHuang_s_blog的博客 1676

Ubuntu搭建Pytorch环境(Anaconda、Cuda、cuDNN、Pytorch、Python、Pycharm、Jupyter)

Ubuntu搭建Pytorch环境(Anconda、Cuda、Pytorch、Python、Pycharm、Jupyter)

funfan的博客 1万+

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2498

ListView动态更新

listview更新有两种方式:一种是通知Adapter更新,不更新Activity,一种是使用Handler。下面就使用notifyDataSetChanged()函数来更新listview 无法贴图,很遗憾,就帖代码吧:main.xml:http://schemas.android.com/apk/res/android"           android:orien

Java学习的专栏 9539

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 子线程更新listview,android-在单独的线程中填充listview

在一个活动中,我加载了一个列表视图的行,这花了很多时间,因此我将此任务放在一个单独的线程中以允许显示progressDialog.我做以下private void doMyStuff() {listItems.clear();progressDialog.show();new Thread(new Runnable() {@Overridepublic void run() {for () {li...

weixin_32822843的博客 441

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

解决WebView实现获得js中Function返回值

整理自:http://blog.sina.com.cn/s/blog_67ac56e70101ajlp.html 本文实现的是使用WebView调用js代码,并获得function的return值 1. 创建自定义的 MyWebView 并继承 WebView  public class MyWebView extends WebView {

4222

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

PhoneGap(Cordova) :js调用native(2) ------Android篇

本文讲解如何使用PhoneGap(Cordova) 调用Android中的方法

1930

CursorAdapter使用

1. Adapter的关系图  2. CursorAdapter构造函数 public CursorAdapter (Context context, Cursor c) Api11开始被弃用 public CursorAdapter (Context context, Cursor c, boolean autoRequery) autoeque

1228

IntentService(或非UI线程)中使用Toast

1.说明 Toast要求必须再UI线程中才能显示,Service默认是再主UI线程上

1064

LoaderManager.LoaderCallbacks的使用

文章为最简单使用记录笔记 1. 作用 实现异步查询 ,  提供了回调机制onLoadFinished()通知最终的运行结果 ,  实现Cursor监听,当改变的时候,进行查询,结果在onLoadFinished()中显示 2.使用  a) 继承 implements View.OnClickListener ,

995

借助Messenger令Intent存取handler

1. 存  intent.putExtra(EXTRA_MESSAGER,new Messenger(handler)); 2. 取

980
上一篇: Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter
下一篇: Android studio error : Failed to find target android-X
Cemmmmer
博客等级 码龄14年 3粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值