首页 文章 精选 留言 我的

精选列表

搜索[幻灯片视图],共8816篇文章
优秀的个人博客,低调大师

Android开发学习笔记:浅谈DDMS视图

DDMS 的全称是Dalvik Debug Monitor Service,即Dalvik调试监控服务,是一个可视化的调试监控工具。它主要是对系统运行后台日志的监控,还有系统线程,模拟器状态的监控。此外,它还可以模拟收发短信,拨打电话和发送GPS位置信息等。 在eclipse中启动DDMS 1.在eclipse界面的右上角,点击,出现下面的界面 2.选择other,这时界面如下图所示,双击DDMS就可以启动 DDMS各部分组成的功能简介 1.Devices 可以查看到所有与DDMS连 接的模拟器详细信息,以及每个模拟器正在运行的APP进程,每个进程最右边相对应的是与调试器链接的端口。 2.Emulator Control可以实现对模拟器的控制,比如:接听电话,根据选项模拟各种不同网络情况,模拟接受SMS消息和发送虚拟地址坐标用于测试GPS功能等。 Telephony Status:通过选项模拟语音质量以及信号连接模式。 Telephony Actions:模拟电话接听和发送SMS到测试终端。 Location Control:模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识,可以通过以下3种方式: (1)Manual:手动为终端发送二维经纬坐标。 (2)GPX:通过GPX文件导入序列动态变化地理坐标,从而模拟行进中GPS变化的数值。 (3)KML:通过KML文件导入独特的地理标识,并以动态形式根据变化的地理坐标显示在测试终端。 3.LogCat主要输出模拟器的一些信息 4.Filter功能类似过滤器,能过滤一些调试的信息 5. V:输出所有的信息 D:输出Debug信息 I:输出info信息 W:输出警告信息 E:输出错误的信息 :能删除当前LogCat输出的信息 6.Threads、Heap、File Exporler,最常用的就是File Exporler文件浏览器,通过File Exporler可以查看Android模拟器中的文件,可以很方便的导入/出文件。 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/631061

优秀的个人博客,低调大师

[Android]ListView性能优化之视图缓存

正文 一、准备 1.1 了解关于Google IO大会关于Adapter的优化,参考以下文章: Android开发之ListView 适配器(Adapter)优化 Android开发——09Google I/O之让Android UI性能更高效(1) PDF下载:Google IO.pdf 1.2 准备测试代码: Activity private TestAdaptermAdapter; private String[]mArrData; private TextViewmTV; @Override protected void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.main); mTV = (TextView)findViewById(R.id.tvShow); mArrData = new String[ 1000 ]; for ( int i = 0 ;i < 1000 ;i ++ ){ mArrData[i] = " GoogleIOAdapter " + i ; } mAdapter = new TestAdapter( this ,mArrData); ((ListView)findViewById(android.R.id.list)).setAdapter(mAdapter); } 代码说明:模拟一千条数据,TestAdapter继承自BaseAdapter,main.xml见文章末尾下载。 二、测试 测试方法:手动滑动ListView至position至50然后往回滑动,充分利用convertView不等于null的代码段。 2.1 方案一 按照Google I/O介绍的第二种方案,把item子元素分别改为4个和10个,这样效果更佳明显。 2.1.1 测试代码 private int count = 0 ; private long sum = 0L ; @Override public ViewgetView( int position,ViewconvertView,ViewGroupparent){ // 开始计时 long startTime = System.nanoTime(); if (convertView == null ){ convertView = mInflater.inflate(R.layout.list_item_icon_text, null ); } ((ImageView)convertView.findViewById(R.id.icon1)).setImageResource(R.drawable.icon); ((TextView)convertView.findViewById(R.id.text1)).setText(mData[position]); ((ImageView)convertView.findViewById(R.id.icon2)).setImageResource(R.drawable.icon); ((TextView)convertView.findViewById(R.id.text2)).setText(mData[position]); // 停止计时 long endTime = System.nanoTime(); // 计算耗时 long val = (endTime - startTime) / 1000L ; Log.e( " Test " , " Position: " + position + " : " + val); if (count < 100 ){ if (val < 1000L ){ sum += val; count ++ ; } } else mTV.setText(String.valueOf(sum / 100L )); // 显示统计结果 return convertView; } 2.1.2 测试结果(微秒除以1000,见代码) 次数 4个子元素 10个子元素 第一次 366 723 第二次 356 689 第三次 371 692 第四次 356 696 第五次 371 662 2.2 方案二 按照Google I/O介绍的第三种方案,是把item子元素分别改为4个和10个。 2.2.1 测试代码 private int count = 0 ; private long sum = 0L ; @Override public ViewgetView( int position,ViewconvertView,ViewGroupparent){ // 开始计时 long startTime = System.nanoTime(); ViewHolderholder; if (convertView == null ){ convertView = mInflater.inflate(R.layout.list_item_icon_text, null ); holder = new ViewHolder(); holder.icon1 = (ImageView)convertView.findViewById(R.id.icon1); holder.text1 = (TextView)convertView.findViewById(R.id.text1); holder.icon2 = (ImageView)convertView.findViewById(R.id.icon2); holder.text2 = (TextView)convertView.findViewById(R.id.text2); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.icon1.setImageResource(R.drawable.icon); holder.text1.setText(mData[position]); holder.icon2.setImageResource(R.drawable.icon); holder.text2.setText(mData[position]); // 停止计时 long endTime = System.nanoTime(); // 计算耗时 long val = (endTime - startTime) / 1000L ; Log.e( " Test " , " Position: " + position + " : " + val); if (count < 100 ){ if (val < 1000L ){ sum += val; count ++ ; } } else mTV.setText(String.valueOf(sum / 100L )); // 显示统计结果 return convertView; } } static class ViewHolder{ TextViewtext1; ImageViewicon1; TextViewtext2; ImageViewicon2; } 2.2.2 测试结果(微秒除以1000,见代码) 次数 4个子元素 10个子元素 第一次 311 417 第二次 291 441 第三次 302 462 第四次 286 444 第五次 299 436 2.3 方案三 此方案为“Henry Hu”提示,API Level 4以上提供,这里顺带测试了一下不使用静态内部类情况下性能。 2.3.1 测试代码 @Override public ViewgetView( int position,ViewconvertView,ViewGroupparent){ // 开始计时 long startTime = System.nanoTime(); if (convertView == null ){ convertView = mInflater.inflate(R.layout.list_item_icon_text, null ); convertView.setTag(R.id.icon1,convertView.findViewById(R.id.icon1)); convertView.setTag(R.id.text1,convertView.findViewById(R.id.text1)); convertView.setTag(R.id.icon2,convertView.findViewById(R.id.icon2)); convertView.setTag(R.id.text2,convertView.findViewById(R.id.text2)); } ((ImageView)convertView.getTag(R.id.icon1)).setImageResource(R.drawable.icon); ((ImageView)convertView.getTag(R.id.icon2)).setImageResource(R.drawable.icon); ((TextView)convertView.getTag(R.id.text1)).setText(mData[position]); ((TextView)convertView.getTag(R.id.text2)).setText(mData[position]); // 停止计时 long endTime = System.nanoTime(); // 计算耗时 long val = (endTime - startTime) / 1000L ; Log.e( " Test " , " Position: " + position + " : " + val); if (count < 100 ){ if (val < 1000L ){ sum += val; count ++ ; } } else mTV.setText(String.valueOf(sum / 100L ) + " : " + nullcount); // 显示统计结果 return convertView; } 2.3.2 测试结果(微秒除以1000,见代码) 第一次:450 第二次:467 第三次:472 第四次:451 第五次:441 四、总结 4.1 首先有一个认识是错误的,我们先来看截图: 可以发现,只有第一屏(可视范围)调用getView所消耗的时间远远多于后面的,通过对 convertView == null内代码监控也是同样的结果。 也就是说ListView仅仅缓存了可视范围内的View,随后的滚动都是对这些View进行数据更新。不管你有多少数据,他都只用ArrayList缓存可视范围内的View,这样保证了性能,也造成了我以为ListView只缓存View结构不缓存数据的假相(不会只有我一人这么认为吧- - #)。这也能解释为什么GOOGLE优化方案一比二高很多的原因。那么剩下的也就只有findViewById比较耗时了。据此大家可以看看AbsListView的源代码,看看 obtainView这个方法内的代码及RecycleBin这个类的实现,欢迎分享。 此外了解这个原理了,那么以下代码不运行你可能猜到结果了: if (convertView == null ){ convertView = mInflater.inflate(R.layout.list_item_icon_text, null ); ((ImageView)convertView.findViewById(R.id.icon1)).setImageResource(R.drawable.icon); ((TextView)convertView.findViewById(R.id.text1)).setText(mData[position]); ((ImageView)convertView.findViewById(R.id.icon2)).setImageResource(R.drawable.icon); ((TextView)convertView.findViewById(R.id.text2)).setText(mData[position]); } else return convertView; 没错,你会发现滚动时会重复显示第一屏的数据! 子控件里的事件因为是同一个控件,也可以直接放到convertView == null 代码块内部,如果需要交互数据比如position,可以通过tag方式来设置并获取当前数据。 4.2 本文方案一与方案二对比 这里推荐如果只是一般的应用(一般指子控件不多),无需都是用静态内部类来优化,使用第二种方案即可;反之,对性能要求较高时可采用。此外需要提醒的是这里也是用空间换时间的做法,View本身因为setTag而会占用更多的内存,还会增加代码量;而findViewById会临时消耗更多的内存,所以不可盲目使用,依实际情况而定。 4.3 方案三 此方案为“Henry Hu”提示,API Level 4以上支持,原理和方案三一致,减少findViewById次数,但是从测试结果来看效果并不理想,这里不再做进一步的测试。 五、推荐文章 Android,谁动了我的内存(1) Android 内存泄漏调试 六、后期维护 2011-3-30 参见这里(http://www.javaeye.com/topic/971782)的讨论,据此将计划写续篇。 结束 对于Google I/O大会这个优化方案一直抱迟疑态度,此番测试总算是有了更进一步的了解,欢迎大家先测试后交流,看看还有什么办法能够再优化一点。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582141,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册