`
923723914
  • 浏览: 634965 次
文章分类
社区版块
存档分类
最新评论

Android中如何提高UI的性能

 
阅读更多

1.减小主线程的阻塞时间

若一个操作耗时教长(超过5秒 用户无响应5秒 网络和数据库阻塞10秒 广播接收者执行超过10秒会导致ANR),我们应该将其放入后台线程中执行,只在需要修改UI界面时通知主线程进行修改。

Android已经提供了AsynTask以实现从主线程生成新的异步任务的方法。具体用法参见异步任务。

2.提高Adapter和AdapterView的效率

(1)重用已生成过的Item View

(2) 添加ViewHolder

(3) 缓存Item的数据

(4)分段显示

3.优化布局文件

如果我们的布局层次过多,那么在我们用findViewById的时间必然会变多,一个变多可能不要紧,但是有很多调用必然会影响性能。

(1) 使用观察布局的工具 Hierarchy Viewer

(2)使用布局优化工具: Layoutopt

(3)优化布局的层次结构

4.背景图

某些时候,我们可能希望能够尽可能多的提高Activity哪怕一点点的性能,这时候我们可以考虑优化Activity背景图。

首先我们必须知道,在android的Activity中,不止有你使用的setContentView时使用的View,还包含一些其它的View。其根View是一个DecorView,你设置的View就包含在其中,id为content。

(1)使用getWindow().setBackgroundDrawable()

(2)自定义主题

创建文件res/vlaues/theme.xml

<resources>

<style name="Theme.CustomBackground" parent="android:Theme">

<item name="android:windowBackground">@null</item>

</style>

</resources>

可根据需要将windowBackground设置为null或你需要的背景图

2.在<activity/>或者<application/>标签中添加 android:theme="@style/Theme.CustomBackground"

5.使用ViewStub

ViewStub是一个看不见,轻量级的View。它没有尺寸,也不会绘制以及以某种形式参与到布局中来。当只有调用Inflate之后其中的View才会被实例化,这意味着用ViewStub保留View层次结构代价是

(1) 延迟加载不常用的UI控件

当某些控件只在很少情况下才会使用,我们可以使用ViewStub来延迟加载,以提高UI加载速度及减小内存消耗。

  1. <spanstyle="font-size:18px;">publicclassDelayLoadActivityextendsActivity{
  2. @Override
  3. protectedvoidonCreate(BundlesavedInstanceState){
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.delay_load);
  6. Buttonbtn=(Button)findViewById(android.R.id.button1);
  7. btn.setOnClickListener(newOnClickListener(){
  8. @Override
  9. publicvoidonClick(Viewv){
  10. v.setEnabled(false);
  11. ViewStubstub=(ViewStub)findViewById(R.id.stub);
  12. Viewinflated=stub.inflate();
  13. }});
  14. }
  15. }
  16. </span>

(2)提高改变布局的速度

需要使用的场景

界面需要频繁切换

希望能提高切换速度

使用方法(以横竖换屏为例)

1.设置Activity的android:configChanges属性为keyboardHidden|orientation

2.为横竖屏分别编写不同的layout

3.创建一个layout,并包含两个ViewStub(分别对应横竖屏)

4.在横竖屏,通过调用ViewStub.inflate创建当前View并将另外一个设为GONE

5.绑定并设置控件的状态

fast_switch.xml

  1. <spanstyle="font-size:18px;"><?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <ViewStubandroid:id="@+id/portrait_subView"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"
  9. android:layout="@layout/portrait"
  10. android:inflatedId="@+id/portrait_view"/>
  11. <ViewStubandroid:id="@+id/landscape_subView"
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"
  14. android:layout="@layout/landscape"
  15. android:inflatedId="@+id/landscape_view"/>
  16. </LinearLayout></span>
  1. <preclass="html"name="code"><spanstyle="font-size:18px;"></span></pre><br>
  2. <pre></pre>
  3. <preclass="html"name="code"><spanstyle="font-size:18px;">publicclassMainActivityextendsActivity{
  4. privatestaticfinalStringTAG="MainActivity";
  5. privateViewStubviewStubLandscape;
  6. privateViewStubviewStubPortrait;
  7. privateViewlandscapeView;
  8. privateViewportraitView;
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.fast_switch);
  13. viewStubLandscape=(ViewStub)findViewById(R.id.landscape_subView);
  14. viewStubPortrait=(ViewStub)findViewById(R.id.portrait_subView);
  15. Displaydisplay=getWindowManager().getDefaultDisplay();
  16. intorientation=display.getOrientation();
  17. Log.d(TAG,"orientation="+orientation);
  18. setOrientation(orientation);
  19. }
  20. publicvoidsetOrientation(intorientation){
  21. switch(orientation){
  22. caseConfiguration.ORIENTATION_LANDSCAPE:
  23. if(landscapeView==null){
  24. landscapeView=viewStubLandscape.inflate();
  25. if(portraitView!=null){
  26. portraitView.setVisibility(View.GONE);
  27. }
  28. }else{
  29. if(portraitView!=null){
  30. portraitView.setVisibility(View.GONE);
  31. }
  32. landscapeView.setVisibility(View.VISIBLE);
  33. }
  34. break;
  35. default:
  36. if(portraitView==null){
  37. portraitView=viewStubPortrait.inflate();
  38. if(landscapeView!=null){
  39. landscapeView.setVisibility(View.GONE);
  40. }
  41. }else{
  42. portraitView.setVisibility(View.VISIBLE);
  43. if(landscapeView!=null){
  44. landscapeView.setVisibility(View.GONE);
  45. }
  46. }
  47. break;
  48. }
  49. }
  50. @Override
  51. publicvoidonConfigurationChanged(ConfigurationnewConfig){
  52. super.onConfigurationChanged(newConfig);
  53. Log.d(TAG,"onConfiguration,orientation="+newConfig.orientation);
  54. setOrientation(newConfig.orientation);
  55. }
  56. }</span></pre>
  57. <p><br>
  58. </p>
  59. <p><spanstyle="font-size:18px"></span></p>
  60. <p><spanstyle="font-size:18px"></span></p>
  61. <pre></pre>
分享到:
评论

相关推荐

    Android代码-AndroidUIAdapter

    适配所有市面上各种大小不一的安卓手机屏幕,特点是可以直接在Android studio的XML编辑器中直接预览不同手机屏幕的适配效果,提高工作效率,且完全不会有性能问题,极易上手 使用 第一步,复制该项目res目录下包含...

    Litho:在 Android 上构建高效 UI 的声明式框架-开源

    Litho 使用声明性 API 来定义 UI 组件。 您只需根据一组不可变的输入来描述 UI 的布局,框架会负责其余的工作。... 除了 Litho 的文本优化之外,这还允许更小的视图层次结构并提高内存和滚动性能。

    《HenCoder Android 开发进阶:UI 1-1 绘制基础》 的练习项目.zip

    在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...

    《HenCoder Android 开发进阶:UI 1-3 文字的绘制》 的练习项目.zip

    在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...

    《HenCoder Android UI 1-2 布局基础》 的练习项目.zip

    在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...

    Android应用开发揭秘(pdf )

     在Android中如何使用语音服务和Google Map Apl? Android如何访问摄象头、传感器等硬件的APl?  如何时行Widget开发?如何用各种Android组件来打造漂亮的UI界面?  Android如何解析XML数据?又如何提高解析速度和...

    《HenCoder Android 开发进阶:UI 1-4 Canvas 对绘制的辅助》 的练习项目.zip

    在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...

    android 动态添加数据到listview

    为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样...

    Android应用程序消息处理机制

    Android应用程序与传统的PC应用程序一样,都是消息驱动的。也就是说,在Android应用程序主线程中,所有函数都是在一个...掌握Android应用程序消息处理机制,有助于我们熟练地使用同步和异步编程,提高程序的运行性能

    Android项目高手过招 FAQ.rar

    本书涵盖了Android开发的多个方面,包括UI设计、数据存储、网络通信、多线程处理、性能优化等。每个问题都提供了详细的解答和示例代码,帮助读者深入理解问题本质,掌握解决方法。此外,本书还提供了一些实用的工具...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    simple-scoreboard:顾名思义,一个简单的Android记分板UI

    顾名思义,这是一个用于Android的简单记分板UI。 您可以添加新玩家,增加/降低玩家分数以及删除玩家。 棒棒糖版本 KitKat版本 设计 SimpleDashboard使用独特的调色板来创建一种简单而现代的设计语言。 材料设计...

    Virtualview-Android:在自定义XML中构建UI的简便方法

    虚拟视图七巧板项目安卓的iOS 服务器在Android... 这使得Android系统中的最终视图变平并且渲染性能得到改善。 动态构建业务组件的XML模板和提高性能的虚拟视图,这是使用VirtualView的两个最重要的原因。 有关更多信息

    《Android应用开发揭秘》源码.rar

    书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以迭代的方式重现了各种常用的android应用和经典android游戏的开发全过程,既可以以它们为范例进行实战演练,又可以将它们直接应用到实际开发中去。...

    [Android项目视频教程]通讯录的开发源码视频讲解

    首先,需要熟悉Android的UI/UX设计原则,以创建出直观、易用的界面。通讯录的界面设计应该简洁明了,使用户能够快速找到所需的功能。 在数据存储方面,Android提供了SQLite数据库作为本地存储解决方案。开发者可以...

    Android代码-debug_view_kotlin

    Debug-View是用Kotlin实现的用于Android调试的浮层调试控制台,这个控制台会一直浮在app的UI最上层, 用于实时地、直观地显示app的性能指标和日志信息:App使用的内存信息、App的实时帧率FPS、app启动时间、Activity...

    TestInAppium:基于Java和Appium的Android自动化测试,实现简单的UI测试和性能测试并自动输出测试报告和性能指标图表

    TestInAppium - 基于Appium的Android自动化测试 代码仅针对我司产品,但集成现今主流的测试方法,为您提供一点小参考 如果本项目对您有一点点帮助,欢迎您能赏个Star:star:,支持我将项目持续维护和开源下去 已实现...

    android群雄传

    12.1 Android 5.X UI设计初步 258 12.1.1 材料的形态模拟 258 12.1.2 更加真实的动画 258 12.1.3 大色块的使用 259 12.2 Material Design主题 260 12.3 Palette 261 12.4 视图与阴影 263 12.5 Tinting和...

    Android中实现WebView和JavaScript的互相调用详解

    虽然从目前来说H5在Android系统中的速度可能还欠佳一些,但相信随着手机的性能不断的提高,这些问题都会被解决 使用H5开发Android的UI界面,最重要的就是如何实现Js代码和Java代码之间的互相调用了 在讲解之前,让...

Global site tag (gtag.js) - Google Analytics