直接搜csdn,下载频道里面有类似的资源,需要你有积分才能下载.
B. 怎么提高android contentresolver的查询效率优化
两种办法:
1.创建自己的ContentProvider,需要继承ContentProvider类
2.如果你的数据和已存在的ContentProvider数据结构一致,可以将数据写到已存在的ContentProvider中
当然前提是获取写该ContentProvider的权限.比如把OA中的成员通讯信息加入到系统的联系人ContentProvider中
ContentProvider基础
所有ContentProvider都需要实现相同的接口,用于查询ContentProvider并返回数据.也包括增加、修改和删除数据.
步骤:
1.获得一个ContentResolver的实例,可通过Activity的成员方法getContentResovler()方法:
ContentResolver cr = this.getContentResolver();
ContentResolver实例带的方法可实现找到指定的ContentProvider并获取到ContentProvider的数据
ContentResolver的查询过程开始,Android系统将确定查询所需的具体ContentProvider,确认它是否启动并运行它.
android系统负责初始化所有的ContentProvider,不需要用户自己去创建.实际上,ContentProvider的用户都不可能直接访问到ContentProvider实例,只能通过ContentResolver在中间代理.
2.数据模型
ContentProvider展示数据类似一个单个数据库表.
其中:
每行有个带唯一值的数字字段,名为_ID,可用于对表中指定记录的定位.
ContentProvider返回的数据结构,是类似JDBC的ResultSet,在android中,是Cursor对象.
URI,每个ContentProvider定义一个唯一的公开的URI,用于指定到它的数据集.
一个ContentProvider可以包含多个数据集(可以看作多张表),这样,就需要有多个URI与每个数据集对应.
这些URI要以这样的格式开头:
content://
表示这个URI指定一个ContentProvider.
如果你想创建自己的ContentProvider,最好把自定义的URI设置为类的常量,这样简化别人的调用,并且以后如果更新URI也很容易.
android定义了CONTENT_URI常量用于URI,如:android.provider.Contacts.Phones.CONTENT_URI
2.查询ContentProvider
要想使用一个ContentProvider,需要以下信息:
定义这个ContentProvider的URI,返回结果的字段名称,这些字段的数据类型
如果需要查询ContentProvider数据集的特定记录(行),还需要知道该记录的ID的值.
构建查询
查询就是输入URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的ContentProvider将返回一个Cursor对象.
可以通过ContentResolver.query()或者Activity.managedQuery()方法.
两者的方法参数完全一样,查询过程和返回值也是相同的.
区别是,通过Activity.managedQuery()方法,不但获取到Cursor对象,而且能够管理Cursor对象的生命周期.
比如当Activity暂停(pause)的时候,卸载该Cursor对象,当Activity Restart的时候重新查询.另外,也可以对一个没有处于Activity管理的Cursor对象做成被Activity管理的,通过调用Activity.startManaginCursor()方法.
类似这样:
Cursor cur = managedQuery(myPerson,null,null,null,null);
其中第一个参数myPerson是Uri类型实例.
如果需要查询的是指定行的记录,需要用_ID值,比如ID值为23,URI将是类似:
content://....../23
android提供了方便的方法,让开发者不需要自己拼接上面这样的URI,比如类似:
Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI,23);
或者:
Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI,"23");
二者的区别是一个接收整数类型的ID值,一个接收字符串类型.
其他几个参数:
names,可以为null,表示取数据集的全部列,或者声明一个String数组,数组中存放列名称,比如:People._ID.一般列名都在该ContentProvider中有常量对应;
针对返回结果的过滤器,格式类似于SQL中的WHERE子句,区别是不带WHERE关键字,如果返回null表示不过滤,比如name=?;
前面过滤器的参数,是String数组,是针对前面条件中?占位符的值;
排序参数,类似SQL的ORDER BY字句,不过不需要写ORDER BY部分,比如name desc,如果不排序,可输入null.
返回值是Cursor对象,游标位置在第一条记录之前.
下面实例适用于android 2.0及以上版本,从android通讯录中得到姓名字段:
java代码:
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
读取返回的数据
如果在查询的时候使用到ID,那么返回的数据只有一条记录.在其他情况下,一般会有多条记录.和JDBC的ResultSet类似,需要操作游标遍历结果集,在每行,再通过列名获取到列的值,可以通过getString()、getInt()、getFloat()等方法获取值.
比如类似下面:
java代码:
while(cursor.moveToNext()) {
builder.append(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))).append("-");
}
和JDBC中不同,没有直接通过列名获取列值的方法,只能先列名获取到列的整型索引值,然后再通过该索引值定位获取列的值.
编辑数据
可以通过ContentProvider实现以下编辑功能:
增加新的记录:
在已经存在的记录中增加新的值、批量更新已经存在的多个记录、删除记录.
所有的编辑功能都是通过ContentResolver的方法实现.一些ContentProvider对权限要求更严格一些,需要写的权限,如果没有会报错.
增加记录
要想增加记录到ContentProvider,首先,要在ContentValues对象中设置类似map的键值对,在这里,键的值对应ContentProvider中的列的名字,键值对的值,是对应列希望的类型.
然后,调用ContentResolver.insert()方法,传入这个ContentValues对象,和对应ContentProvider的URI即可.返回值是这个新记录的URI对象.这样你可以通过这个URI获得包含这条记录的Cursor对象.
比如:
java代码:
ContentValues values = new ContentValues();
values.put(People.NAME,"Abraham Lincoln");
Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
在原有记录上增加值
如果记录已经存在,可在记录上增加新的值,或者编辑已经存在的值.
首先要找到原来的值对象,然后要清除原有的值,然后像上面增加记录一样即可:
java代码:
Uri uri = Uri.withAppendedPath(People.CONTENT_URI, "23");
Uri phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE);
values.put(People.Phones.NUMBER, "1233214567");
getContentResolver().insert(phoneUri, values);
批量更新值
批量更新一组记录的值,比如NY改名为Eew York.可调用ContentResolver.update()方法.
删除记录
如果是删除单个记录,调用ContentResolver.delete()方法,URI参数,指定到具体行即可.
如果是删除多个记录,调用ContentResolver.delete()方法,URI参数指定Contentprovider即可,并带一个类似SQL的WHERE子句条件.这里和上面类似,不带WHERE关键字.
创建自己的ContentProvider
创建contentprovider,需要设置存储系统.大多数ContentProvider使用文件或者SQLite数据库,不过你可以用任何方式存储数据.android提供SQLiteOpenHelper帮助开发者创建和管理SQLiteDatabase.
继承ContentProvider,提供对数据的访问.在manifest文件中声明ContentProvider.继承ContentProvider类
必须定义ContentProvider类的子类,需要实现如下方法:
java代码:
query()
insert()
update()
delete()
getType()
onCreate()
在实现子类的时候,还有一些步骤可以简化ContentProvider客户端的使用:
定义public static final Uri常量,名称为CONTENT_URI:
java代码:
public static final Uri CONTENT_URI = Uri.parse("content://com.example.codelab.transportationprovider");
如果有多个表,它们也是使用相同的CONTENT_URI,只是它们的路径部分不同.
声明ContentProvider
创建ContentProvider后,需要在manifest文件中声明,android系统才能知道它,当其他应用需要调用该ContentProvider时才能创建或者调用它.
语法类似:
<provider android:name="com.easymorse.cp.MyContentProvider"
android:authorities="com.easymorse.cp.mycp">
</provider>
android:name要写ContentProvider继承类的全名.
android:authorities要写和CONTENT_URI常量的B部分
C. 安卓开发的入门书籍大家推荐几本
1、《GoogleAndroidSDK开发范例大全》
《GoogleAndroidSDK开发范例大全》是2010年人民邮电出版社出版的图书。全书共分10章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、使用Android手机收发短信等通信服务。
2、《Android软件安全权威指南》
本书主要介绍Android平台上的软件安全技术。从平台搭建和语言基础开始,循序渐进地讲解了Android平台上的软件攻防技术。本书共12章,系统地讲解了与Android软件安全相关的环境搭建、文件格式、静态分析、动态调试、Hook与注入、软件保护技术、软件壳等多个主题。
3、《Android开发精要》
《Android开发精要》是2012年机械工业出版社出版的图书,作者是范怀宇。该书讲述的是如何才能写出贴近Android设计理念、能够更加高效和可靠运行的Android应用,通过Android的源代码去了解其底层实现细节是最重要的方法之一。
4、《Android应用性能优化》
《Android应用性能优化》是2012年人民邮电出版社出版的图书,作者是[法] Hervé Guihot。本书主要介绍如何快速高效地优化应用,让应用变得稳定高效。
5、《Android应用UI设计模式》
《Android应用UI设计模式》面向Android 4.0+操作系统,是市面上第一本深入解析Android界面设计的佳作。《Android应用UI设计模式》从适用于移动设备和平板的通用模式以及Android UI设计指南出发。
参考资料来源:
网络—《GoogleAndroidSDK开发范例大全》
网络—《Android软件安全权威指南》
网络—《Android开发精要》
网络—《Android应用性能优化》
网络—《Android应用UI设计模式》
D. android性能测试工具有哪些
有如下几个工具:
android针对上面这些会影响到应用性能的情况提供了一些列的工具:
1 布局复杂度:
hierarchyviewer:检测布局复杂度,各视图的布局耗时情况:
Android开发者模式—GPU过渡绘制:
2 耗电量:Android开发者模式中的电量统计;
3 内存:
应用运行时内存使用情况查看:Android Studio—Memory/CPU/GPU;
内存泄露检测工具:DDMS—MAT;
4 网络:Android Studio—NetWork;
5 程序执行效率:
静态代码检查工具:Android studio—Analyze—Inspect Code.../Code cleanup... ,用于检测代码中潜在的问题、存在效率问题的代码段并提供改善方案;
DDMS—TraceView,用于查找程序运行时具体耗时在哪;
StrictMode:用于查找程序运行时具体耗时在哪,需要集成到代码中;
Andorid开发者模式—GPU呈现模式分析。
6 程序稳定性:monkey,通过monkey对程序在提交测试前做自测,可以检测出明显的导致程序不稳定的问题,执行monkey只需要一行命令,提交测试前跑一次可以避免应用刚提交就被打回的问题。
说明:
上面提到的这些工具可以进Android开发者官网性能工具介绍查看每个工具的介绍和使用说明;
Android开发者选项中有很多测试应用性能的工具,对应用性能的检测非常有帮助,具体可以查看:All about your phone's developer options和15个必知的Android开发者选项对Android开发者选项中每一项的介绍;
针对Android应用性能的优化,Google官方提供了一系列的性能优化视频教程,对应用性能优化具有非常好的指导作用,具体可以查看:优酷Google Developers或者Android Performance Patterns。
二 第三方性能优化工具介绍
除了android官方提供的一系列性能检测工具,还有很多优秀的第三方性能检测工具使用起来更方便,比如对内存泄露的检测,使用leakcanry比MAT更人性化,能够快速查到具体是哪存在内存泄露。
leakcanary:square/leakcanary · GitHub,通过集成到程序中的方式,在程序运行时检测应用中存在的内存泄露,并在页面中显示,在应用中集成leancanry后,程序运行时会存在卡顿的情况,这个是正常的,因为leancanry就是通过gc操作来检测内存泄露的,gc会知道应用卡顿,说明文档:LeakCanary 中文使用说明、LeakCanary: 让内存泄露无所遁形。
GT:GT Home,GT是腾讯开发的一款APP的随身调测平台,利用GT,可以对CPU、内存、流量、点亮、帧率/流畅度进行测试,还可以查看开发日志、crash日志、抓取网络数据包、APP内部参数调试、真机代码耗时统计等等,需要说明的是,应用需要集成GT的sdk后,GT这个apk才能在应用运行时对各个性能进行检测。
E. 论述android系统开发平台应有哪些需要改进
在系统运行的稳定性上需要进一步加强,因为这极大的影响到产品的使用价值以及产品的体验感,另外在安卓的内部运行上,这导致速度慢于iOS系统。
论述android系统开发平台需要改进性能问题在系统的分类上,性能优化原则和方法,借助性能优化工具分析解决问题。安卓与IOS系统比起来,我们都知道安卓手机的弊端是在后台偷偷的运行程序,非常占内存也非常耗电,那么,肯定有人会问现在的华为手机有没有这种现象,答案是肯定的有的,因为华为搭载的操作系统也是在安卓系统上面进行修改完善的。
至于苹果手机就没有后台运行的程序,其归根结底还是归根于安卓系统与苹果系统的底层架构不同而导致的。
比如我们的安卓手机在打开很多个应用的时候,我们的程序都是跑在安卓虚拟机钟,每个程序会开一个线程或者是多个线程。
这样一来的话,我们关闭程序的话有可能关不掉其中的线程,所以这些程序都会耗电或者占据内存。
其次定期清理手机,通过手机管家查看偷偷运行的程序,并且停止这些程序,手机定期杀毒以及清理不用的文件等。
比如用华为的手机管家,可以找到手机管家---再找到启动管理----然后再去根据自己的需要进行设置都是可以关闭掉这些后台程序的。
F. 《Android移动性能实战》pdf下载在线阅读全文,求百度网盘云资源
《Android移动性能实战》网络网盘pdf最新全集下载:
链接: https://pan..com/s/1CWv_UCTs0sAHSAfkVQetjw
G. 针对Android的性能优化集中哪些方面
一、概要:
本文主要以Android的渲染机制、UI优化、多线程的处理、缓存处理、电量优化以及代码规范等几方面来简述Android的性能优化
二、渲染机制的优化:
大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。
Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。
*关于JobScheler的更多知识可以参考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html
七、代码规范
1)for loop中不要声明临时变量,不到万不得已不要在里面写try catch。
2)明白垃圾回收机制,避免频繁GC,内存泄漏,OOM(有机会专门说)
3)合理使用数据类型,StringBuilder代替String,少用枚举enum,少用父类声明(List,Map)
4)如果你有频繁的new线程,那最好通过线程池去execute它们,减少线程创建开销。
5)你要知道单例的好处,并正确的使用它。
6)多用常量,少用显式的"action_key",并维护一个常量类,别重复声明这些常量。
7)如果可以,至少要弄懂设计模式中的策略模式,组合模式,装饰模式,工厂模式,观察者模式,这些能帮助你合理的解耦,即使需求频繁变更,你也不用害怕牵一发而动全身。需求变更不可怕,可怕的是没有在写代码之前做合理的设计。
8)View中设置缓存属性.setDrawingCache为true.
9)cursor的使用。不过要注意管理好cursor,不要每次打开关闭cursor.因为打开关闭Cursor非常耗时。Cursor.require用于刷cursor.
10)采用SurfaceView在子线程刷新UI,避免手势的处理和绘制在同一UI线程(普通View都这样做)
11)采用JNI,将耗时间的处理放到c/c++层来处理
12)有些能用文件操作的,尽量采用文件操作,文件操作的速度比数据库的操作要快10倍左右
13)懒加载和缓存机制。访问网络的耗时操作启动一个新线程来做,而不要再UI线程来做
14)如果方法用不到成员变量,可以把方法申明为static,性能会提高到15%到20%
15)避免使用getter/setter存取field,可以把field申明为public,直接访问
16)私有内部类要访问外部类的field或方法时,其成员变量不要用private,因为在编译时会生成setter/getter,影响性能。可以把外部类的field或方法声明为包访问权限
17)合理利用浮点数,浮点数比整型慢两倍
18)针对ListView的性能优化,ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。ListView中getView是性能是关键,这里要尽可能的优化。
getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库操作,否则会严重影响滑动时的性能
19)不用new关键词创建类的实例,用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。
clone()方法不会调用任何类构造函数。在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:
20)public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。
21)乘法和除法
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
22)ViewPager同时缓存page数最好为最小值3,如果过多,那么第一次显示时,ViewPager所初始化的pager就会很多,这样pager累积渲染耗时就会增多,看起来就卡。
23)每个pager应该只在显示时才加载网络或数据库(UserVisibleHint=true),最好不要预加载数据,以免造成浪费
24)提高下载速度:要控制好同时下载的最大任务数,同时给InputStream再包一层缓冲流会更快(如BufferedInputStream)
25)提供加载速度:让服务端提供不同分辨率的图片才是最好的解决方案。还有合理使用内存缓存,使用开源的框架
引用:Android性能优化的浅谈
H. Android TextView使用及性能优化
TextView 是Android中最常用的控件,在这里记录下TextView 的用法;
在Android中可以使用系统自带的4种字体:
在XML中使用 android:typeface="normal" 进行设置
将字体文件放到main/assets/fonts目录下,使用Asset读取字体后进行设置
使用 android:drawableLeft="@mipmap/ic_launcher" 可以设置一张图片显示在文字的上下左右,减少布局层级
使用Span能够在一段TextView中设置不同颜色的字体,链接,图片等内容
使用ClickableSpan 能够设置一段文字的点击事件
创建自己的MyClickableSpan:
之后使用SpannableStringBuilder来创建字符串,并使用setSpan来为字符串的一部分设置Span对象
其中setSpan()方法的最后一个参数标识有以下常量,这些常量标识着在 对SpannableStringBuilder进行insert时 添加的字符适用的规则:
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
Spanned.SPAN_EXCLUSIVE_INCLUSIVE
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
Spanned.SPAN_INCLUSIVE_INCLUSIVE
前一个 EXCLUSIVE / INCLUSIVE 标识着在设置了Span的一段字符之前(紧挨着)插入字符时,被不被包含到Span范围中, EXCLUSIVE 表示包含, INCLUSIVE 表示不包含;
第二个 EXCLUSIVE / INCLUSIVE 同理表示插入这段字符之后的效果;
ImageSpan用于在TextView中插入图片,可以用来实现图文混排
使用方法:
这样实现的效果是文字与图片底部进行对齐,如果需要图片中线与文字中线对其,需要自己重写ImageSpan
Android 中的TextView中存在着很多EditText中的特性,在setText()方法中会涉及到很多Span相关的操作,比如设置TextWatcher,重新构造Spannable等操作,在我们仅仅显示静态文本的时候这些操作都是没有必要的(通过使用普通的TextView进行Debug来验证普通的TextView的确是Span的);
在大量显示静态文本的时候就可以通过StaticLayout来计算出TextView的布局信息,这项工作可以放到非UI线程来进行,能够减少在setText()的时候UI线程的耗时,达到优化TextView性能的目的;
StaticLayout是TextView中用于显示多行静态文本的Layout,也是能够支持SpannableString的,只是不能在Span变化之后重新Layout,所以在大部分场景下已经适用;
通过这个自定义的View来显示Text,在onDraw()的时候直接使用layout来进行绘制,而设置需要显示的文本则直接使用setLayout()来实现
使用下面给出的参考链接中的测试Demo在 ZTE A2017 Android7.1.1 高通820设备上,普通TextView在ListView中连续滚动的帧数是55帧,使用StaticLayout的结果为60帧
可以作为在APP使用CPU资源较多的情况下的优化手段
参考链接: TextView预渲染研究
在Android中,TextView的测量消耗了大量的时间,Android P中提供了PrecomputedText能够将测量这个过程放到后台来执行,减轻对于UI线程的卡顿;
非Android P时,使用AppCompatTextView控件,使用setTextFeature()方法来将文本的measure过程放到其他线程来执行,而不是直接将text应用于TextView;
在调用了这个方法之后如果对TextView进行边距,文字大小等的设置都将会报错;
Prefetch Text Layout in RecyclerView
PrecomputedTextCompat
在ListView中仅替换设置Text的方法时未测试出性能与普通方法有什么优势,猜测是ListView没有在getView和显示之间预留时间,
测试项目地址:
https://github.com/GavynZhang/PrecomuptedTextViewTest
I. 电脑培训分享Android模拟器大幅优化
来自Android开发者博客的消息,Android模拟器现在已经有了多项改进和优化,可以让开发者们更方便的进行应用开发。
Android模拟器是Android开发者进行应用研发和测试的重要工具,由于目前Android的硬件设备的快速成长,模拟器已经稍显落后。现在新的模拟器已经带来了包括GPU支持、CPU加速、传感器支持、多手指输入等新的功能。
在最新的Android 4.0.3 R2模拟器中,已经加入了GPU支持,可以支持OpenGL ES 2.0标准,让开发者可以借助模拟器来测试自己的OpenGL游戏。
在去年新增了摄像头支持之后,现在的新版模拟器也加入了包括多点触摸输入设备的支持,未来还将加入蓝牙和NFC支持。
改进的模拟器现在可以通过使用本地CPU实现更快的执行效率,电脑培训http://www.kmbdqn.com/认为这对于一些通过模拟器体验新版系统的玩家来说也是好事,不会再像之前那样卡了。