*ListView 异步更新出现问题的解决(Handler)

在ListView中实现异步加载 前言:因为在项目中获取网络就会出现耗时操作,便需要用到异步的方式将耗时操作与组件分开,于是去找了视频去学习异步加载,在此对整体的思想做个总结并附上部分源码。 android中的异步加载:Android中,异步实现,一般用handler和AsyncTask,通常handler是一个消息栈,而AsyncTask不是。 具体区别:AsyncTask比Java原始的Thread更灵活和强大,但对于轻量 阅读详情

    忙了一天,终于把问题给解决了,描述一下过程。要完成的功能是Activity中有一个ListView(itemsListView),通过开启一个线程来读取数据库中的联系人列表,ListView通过自定义的BaseAdapter进行关联,

出现的问题代码如下:

       List<String> nameList;         ?/用于存放联系人的数据源

        itemsListView.setAdapter(new MyListAdapter()):

private class MyListAdapter extends BaseAdapter
    {
        Context context;
        MyListAdapter()
        {
            //this.context = context;
        }
        
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            int i = 0;
            try{
                i = nameList.size();
            }catch(Exception e)
            {
                 Log.e("ERROR", "ERROR IN CODE: " + e.toString());  
                 return i;
            }
            return i;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
              TextView mTextView = new TextView(getApplicationContext());  
              mTextView.setTextSize(18);
              mTextView.setHeight(20);
              mTextView.setBackgroundColor(Color.GRAY);
            try{
        
                  if(nameList.get(position) != null)
                  {
                      mTextView.setText(nameList.get(position));  
                      mTextView.setTextColor(Color.YELLOW);  
                  }
              
           
            }catch(Exception e)
            {
                 Log.e("ERROR", "ERROR IN CODE: " + e.toString());  
            }
             return mTextView;  
    
        }

}

当然,代码中的一些try块是用于调试,不必理会。声明了一个

         Handler mHandler = new Handler(){

          public void handleMessage(Message msg)

         {

                  if(msg.what == REFLESH_LIST)   //REFLESH_LIST 是Activity中定义的int常量

                   {

                       mAdapter.notifyDataSetChanged();

                         itemsListView.setAdapter(mAdapter);

                   }

           }

}


           Thread mThread = new Thread()

{

           public void run()

        {

                 String tmp = DataBaseread();            //这里DataBaseRead是读取数据库中的一个联系人,返回该联系人的name

                  nameList.add(tmp);

                  mHandler.sendEmptyMessage(REFLESH_LIST);

       }

}

        编译、第一次运行没有问题,但是当我按Back键后,再次进入后发现了严重问题,出现了ListView内部layoutChildren函数的问题,查了一天的资料,那个痛苦哦,很多解决方案都不管用

有的说在  notifyDataSetChanged方法前面加入itemsListView.setVisibility(View.GONE),在其后加入itemsListView.setVisibility(View.Visible)

有的利用ListView 的requestLayout方法替代notifyDataSetChanged,以及换成AsyncTask来做,很多都还是老外们的方法,但都不能解决我的问题,后来怀疑是同步问题,因为线程不停添加nameList中的而数据,并发送Msg给Handler,而有可能会出现Msg队列堆积起来,来不及处理的情况,这样的话nameList的实际数据与mAdapter中提供给ListView的数据不一致,所以尝试了下面的方法,将nameList添加元素和notififyDataChanged函数放到了一起执行,测试了一下,竟然真是这样的原因,豁然开朗哇,呵呵,更改如下:


           Thread mThread = new Thread()

{

           public void run()

        {

                 String tmp = DataBaseread();            //这里DataBaseRead是读取数据库中的一个联系人,返回该联系人的name

                     Message msg = new Message();
                            msg.obj = new String(tmp);
                            msg.what = REFRESH_LIST;
                    
                               mHandler.sendMessage(msg);

              }

}
                       
private Handler mHandler = new Handler()
    {
            public void handleMessage(Message msg) {
                 
                                     nameList.add((String)msg.obj);
                                   mAdapter.notifyDataSetChanged();
                                    itemsListView.setVisibility(View.VISIBLE);
                             
                    super.handleMessage(msg);
            }
           
    };

      希望对大家有帮助!!!!!!!!!!!有什么可以跟我 留言,大家相互讨论



【OpenBMC 系列】4.启动流程 使用qume模拟ast2600-evb 1.安装openbmc适配的qume 2.启动bmc 3.使用bmc web 阅读详情

相关推荐

【cocos2dx面试题干货】--2021年最新cocos2dx面试干货(引擎篇)

【cocos2dx面试题干货】--2020年度最新cocos2dx面试干货(引擎篇 ) 大家好,我是Lampard~~ 经过春招一番艰苦奋战之后,我终于是进入了心仪的公司。 今天给大家分享一下我在之前精心准备的一套面试知识。 由于我面试的岗位是cocos2dx的开发岗,今天就先给大家分享一下引擎方面的知识。 本人亲测80%的引擎相关题目都...

Lampard的博客 1万+

联网请求数据+更新ListView的UI——学习笔记

联网的框架有很多,我试着分别用了两个,一个是Volley,一个是Okhttp。在使用过程中,有大大小小的坑,把我这两天的时间都浪费光了,不过解决这些问题后我确实又明白了很多知识,虽然这些知识在之前看书的时候都学过,但是理解不够,用的时候自然无从下手,现在明白一些了,就把这些都记录一下。首先说一下使用过程中的坑吧,第一个坑,我在用volley去请求网络后,然后在volley请求成功的回调方法里面打印了

asjqkkkk的博客 642

【干货】S7-PLCSIM Advanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

【干货】S7-PLCSIM Adavanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

handinvv的博客 5万+

C#轻松解决异步操作提升Winform的用户体验并解决后台Listview的闪烁问题

话不多说直接进入主题,当我们在VS项目中生成一个窗体时,就默认开启了管理该窗体 包括控件的输入输出调用等等的UI进程,而且如果不进行干预该进程就是窗体应用程序的 主进程,在项目中所有的操作都会占用该进程。 可能你也会有这样的疑问:我们写的代码逻辑没有问题,源码中确实也执行了控件的相 关操作就算是占用主线程为什么等任务彻底结束后关于界面的操作才会有响应呢?因为 占用UI进程的操作带来的影响就是--...

Found You的博客 1420

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念

摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字)

weixin_49761275的博客 4268

有关SPSS中Fisher精确检验无法进行的解决方法(由于无法打开临时文件,因此无法进行计算)

最近在帮一个四年生完成她的毕业论文,在用SPSS进行R×C表检验的时候,发现Fisher精确检验的结果无法显示,提示为“由于无法打开临时文件,因此无法进行计算”,大概像下图一样。 (这图是从网上找的) 然...

chuyang37的博客 3万+

ListView的异步加载(笔记,多线程和AsyncTask)

异步加载最常用的两种方式: 多线程,线程池     AsyncTask 实例操作: 从一个网站上获取Json数据,然后将数据在ListView上显示。 1.创建item_layout布局 , 修改主界面布局 item_layout.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

逆风的方向 更适合飞翔 4713

43、基于机器学习的GNSS信号质量监测方法

本文提出了一种基于支持向量机(SVM)的GNSS信号质量监测方法,旨在有效检测邪恶波形(EWF)威胁并抑制多径干扰对导航精度的影响。通过构建包含现场采集与合成数据的数据集,结合11个相关器测量值、链路预算、仰角和方位角等特征,采用RBF核函数的SVM模型进行分类。研究评估了不同平滑时间窗口对漏检率和误报率的影响,结果表明在约35-40秒平滑时间下性能趋于稳定,并可通过多数投票机制进一步优化检测性能。该方案适用于星载GNSS接收器,在计算资源受限条件下实现了高可靠性与低完整性风险的平衡。

yyy34的博客 188

ListView的用法以及即时刷新

最近写了一个关于Android开发的项目,其中用到了ListView,在这里总结一下。这是我的ListView<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

qq_40014062的博客 8938

04 HCM CPI SF集成-员工集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 146

ABAP CDS 视图参数 parameter_list 详解与最佳实践:从语法、作用域到可运行范例

本文系统梳理了ABAP CDS视图的WITH PARAMETERS定义与使用。主要内容包括:1)参数声明语法及其在整条SELECT语句中的贯穿使用;2)参数在WHERE/HAVING/ON等位置的多种写法(:pname和$parameters.pname);3)参数在航空公司航线筛选等实际业务场景中的应用;4)参数与会话变量的协作策略;5)在JOIN ON、HAVING、CASE等高级用法中的实践;6)提供完整的CDS视图与ABAP程序示例,展示参数声明、使用及Open SQL传参方式。所有内容均基于SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 372

notifyDataSetChanged() 动态更新ListView

有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载。 布局main.xml:

zhangkongzhongyun的专栏 1074

【Windows Server 2019】存储服务器的配置和管理——iSCSI的安装和配置(下)

博文介绍了如何使用Windows 10 和 ESXi 验证iSCSI服务器部署成功以及如何管理iSCSI服务 。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 8000

Android笔记——Day9 *Android异步操作 *Http操作基础 *ListView使用方法

1、Android异步操作   ··之前说过用Thread和Handler可以再Android中实现异步处理,这里讨论的使用AsyncTask类来实现异步处理,相比之下,运用这种方法来完成异步操作更为简单。贴个地址:http://blog.youkuaiyun.com/mylzc/article/details/6772129 1)AsyncTask类中有许多函数,在执行AsyncTask时对应...

QCheng 191

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ListView动态加载数据分页(使用Handler+线程和AsyncTask两种方法)

在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它接收子线程发送的数据,并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄。 一、使用Handler+线程方法

wangyan9110's Blog 1034

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android listview 只加载显示的图片大小,Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)...

最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也就是20张图片,会导致listview滑动卡顿!这是用户不想看到的,我参考了网易新闻和电子市场等应用,发现它们都是只加载屏幕内的图片,不现实的不加载,于是我也仿照做了一个。我是菜鸟,我承认 呵呵,虽然...

weixin_35017289的博客 168

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

AsyncTask异步任务 源码解读

之前我们介绍了Handler的一些基本用法,也解读了Handler的源码。通过Handler我们可以简便的切换到主线程进行UI操作。而AsyncTask的出现使我们不用去关心线程管理和切换的一些细节,我们可以更轻松的去操作UI。

maplejaw的博客 4909

解决ListView滑动时卡的问题,实现异步加载图片解决

ListView是最为常见的空间之一,现在的应用的呈现形式大多数都需要用到ListView来呈现,以列表的方式最直观最便于操作。 那么在使用的过程中大家一定使用adapter适配器来匹配这个ListView,问题就来了,如果直接使用sampleAdapter的话,会出现诸多的问题,诸如滚动的时候很卡,特别是每一行都有头像啊什么的,再加上数据量一大,兼职就卡的不行,那么先来说说解决卡的...

a531548802的博客 111

异步解析 HttpURLConnection方式在listview展示

package moni1zhoukao.bwei.com.moni1zhoukao; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import andr...

qq_41992168的博客 406

Android 网上下载图片 保存在文件中 更新listview

 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML资源,其中包括图片,我们要做的解析XML里面的数据,并且把图片缓存到本地一个cache目录里面,并且用一个自定义的Adapter去填充到LIstView,demo运行效果见下图: 通过这个demo,要学会有一下几点 1.怎么解

kc58236582的博客 1408

android中ListView数据刷新时的同步

&lt;groupinfo&gt;&lt;/groupinfo&gt; public class Main extends BaseActivity { private static final String TAG = "tag"; private static final int STATUS_CHANGE = 0; ExpandableLis...

xuela-net 121

使用异步任务加载网络上json数据并加载到ListView中

Android中使用网络访问来加载网上的内容,并将其解析出来加载到控件中,是一种很常见的操作。但是Android的UI线程(也就是主线程)中是不允许进行耗时操作的,因为耗时操作会阻塞主线程,影响用户体验。而访问网络同样是一个耗时操作,并且Android3.0以后是不允许在主线程中访问网络的,所以我们这里用Android封装好的AsyncTask类来完成这些耗时操作。   项目的目录结构如下:

SAberDepth的博客 1458
上一篇: Android AsyncTask异步线程
下一篇: Android 媒体库数据更新
shareCode
博客等级 码龄15年 125粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值