十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
你好: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读。 2.使用线程池,分为核心线程池和普通线程池,下载图片等耗时任务放置在普通线程池,避免耗时任务阻塞线程池后,导致所有异步任务都必须等待 3.listview 性能优化 1).异步加载图片 item中如果包含有webimage,那么最好异步加载 2).快速滑动时不显示图片 当快速滑动列表时(SCROLL_STATE_FLING),item中的图片或获取需要消耗资源的view,可以不显示出来;而处于其他两种状态(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),则将那些view显示出来 3).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用。如果couvertview中的view需要添加listerner,代码一定要在if(convertView==null){}之外。 4).BaseAdapter避免内存溢出 如果BaseAdapter的实体类有属性非常消耗内存,可以将保存到文件;为提高性能,可以进行缓存,并限制缓存大小。 4.尽量避免static成员变量引用资源耗费过多的实例,比如Context 5.异步任务,分为核心任务和普通任务,只有核心任务中出现的系统级错误才会报错,异步任务的ui操作需要判断原activity是否处于激活状态 6.保证Cursor 占用的内存被及时的释放掉,而不是等待GC来处理。并且 Android明显是倾向于编 程者手动的将Cursor close掉 7.线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程 生命周期的不可控 8.使用WeakReference代替强引用,弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。 9.超级大胖子Bitmap及时的销毁(Activity的onDestroy时将bitmap回收,在被UI组件使用后马上进行回收会抛 RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap)设置一定的采样率(有开发者提供的图片无需进行采样,对于有用户上传或第三方的大小不可控图片,可进行采样减少图片所占的内存),从服务端返回图片,建议同时反馈图片的size巧妙的运用软引用drawable对应resid的资源,bitmap对应其他资源任何类型的图片,如果获取不到(例如文件不存在,或者读取文件时跑OutOfMemory异常),应该有对应的默认图片(默认图片放在在apk中,通过resid获取); 10.Drawable中ui组件需要用到的图片是apk包自带的,那么一律用setImageResource或者setBackgroundResource,而不要根据resourceid 注意:get(getResources(), R.drawable.btn_achievement_normal)该方法通过resid转换为drawable,需要考虑回收的问题,如果drawable是对象私有对象,在对象销毁前是肯定不会释放内存的。 11.复用、回收Activity对象临时的activity及时finish主界面设置为singleTask一般界面设置为singleTop 12.如果ImageView的图片是来自网络,进行异步加载 13.应用开发中自定义View的时候,交互部分,千万不要写成线程不断刷新界面显示,而是根据TouchListener事件主动触发界面的更新 14.在onResume时设置该界面的电源管理,在onPause时取消设置 15.位置信息获取用户的地理位置信息时,在需要获取数据的时候打开GPS,之后及时关闭掉
创新互联于2013年创立,先为启东等服务建站,启东等地企业,进行企业商务咨询服务。为启东企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
笔者在经历了多个Android开发项目之后,个人积累也从别处学习了很多在Android开发中非常实用的小经验。下面从中选择了最实用的16条,分享给大家。
1.TextView中的getTextSize返回值是以像素(px)为单位的,而setTextSize()是以sp为单位的.所以如果直接用返回的值来设置会出错,解决办法是用setTextSize()的另外一种形式,可以指定单位:
1
2
3
4
span style="font-size:16px;"setTextSize(int unit, int size)
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels/span
2.在继承自View时,绘制bitmap时,需要将图片放到新建的drawable-xdpi中,否则容易出现绘制大小发生改变。
3.在文字中加下划线: textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG)。
4.scrollView是继承自frameLayout,所以在使用LayoutParams时需要用frameLayout的。
5.在Android中几种网络编程的方式:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有 一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection
(4)Google 集成了Apache HTTP客户端,可使用HTTP进行网络编程。针对HTTP,Google集成了Appache Http core和httpclient 4版本,因此特别注意Android不支持 httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar
(5)使用Web Service。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice
(6) 直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
6.TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
这个是我们最常用的一个构造方法,
float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;
float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;
float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;
float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;
如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点 (x+toXDelta,y+toYDelta)点。
7.android提供了几种在其他线程中访问UI线程的方法
常用的Android性能优化方法:
一、布局优化:
1)尽量减少布局文件的层级。
层级少了,绘制的工作量也就少了,性能自然提高。
2)布局重用 include标签
3)按需加载:使用ViewStub,它继承自View,一种轻量级控件,本身不参与任何的布局和绘制过程。他的layout参数里添加一个替换的布局文件,当它通过setVisibility或者inflate方法加载后,它就会被内部布局替换掉。
二、绘制优化:
基于onDraw会被调用多次,该方法内要避免两类操作:
1)创建新的局部对象,导致大量垃圾对象的产生,从而导致频繁的gc,降低程序的执行效率。
2)不要做耗时操作,抢CPU时间片,造成绘制很卡不流畅。
三、内存泄漏优化:
1)静态变量导致内存泄漏 比较明显
2)单例模式导致的内存泄漏 单例无法被垃圾回收,它持有的任何对象的引用都会导致该对象不会被gc。
3)属性动画导致内存泄漏 无限循环动画,在activity中播放,但是onDestroy时没有停止的话,动画会一直播放下去,view被动画持有,activity又被view持有,导致activity无法被回收。
四、响应速度优化:
1)避免在主线程做耗时操作 包括四大组件,因为四大组件都是运行在主线程的。
2)把一些创建大量对象等的初始化工作放在页面回到前台之后,而不应该放到创建的时候。
五、ListView的优化:
1)使用convertView,走listView子View回收的一套:RecycleBin 机制
主要是维护了两个数组,一个是mActiveViews,当前可见的view,一个是mScrapViews,当前不可见的view。当触摸ListView并向上滑动时,ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范围,此时这些OnScreen的View就变得不可见了,不可见的View叫做OffScreen的View,即这些View已经不在屏幕可见范围内了,也可以叫做ScrapView,Scrap表示废弃的意思,ScrapView的意思是这些OffScreen的View不再处于可以交互的Active状态了。ListView会把那些ScrapView(即OffScreen的View)删除,这样就不用绘制这些本来就不可见的View了,同时,ListView会把这些删除的ScrapView放入到RecycleBin中存起来,就像把暂时无用的资源放到回收站一样。
当ListView的底部需要显示新的View的时候,会从RecycleBin中取出一个ScrapView,将其作为convertView参数传递给Adapter的getView方法,从而达到View复用的目的,这样就不必在Adapter的getView方法中执行LayoutInflater.inflate()方法了。
RecycleBin中有两个重要的View数组,分别是mActiveViews和mScrapViews。这两个数组中所存储的View都是用来复用的,只不过mActiveViews中存储的是OnScreen的View,这些View很有可能被直接复用;而mScrapViews中存储的是OffScreen的View,这些View主要是用来间接复用的。
2)使用ViewHolder避免重复地findViewById
3)快速滑动不适合做大量异步任务,结合滑动监听,等滑动结束之后加载当前显示在屏幕范围的内容。
4)getView中避免做耗时操作,主要针对图片:ImageLoader来处理(原理:三级缓存)
5)对于一个列表,如果刷新数据只是某一个item的数据,可以使用局部刷新,在列表数据量比较大的情况下,节省不少性能开销。
六、Bitmap优化:
1)减少内存开支:图片过大,超过控件需要的大小的情况下,不要直接加载原图,而是对图片进行尺寸压缩,方式是BitmapFactroy.Options 采样,inSampleSize 转成需要的尺寸的图片。
2)减少流量开销:对图片进行质量压缩,再上传服务器。图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap,所谓的质量压缩,它其实只能实现对file的影响,你可以把一个file转成bitmap再转成file,或者直接将一个bitmap转成file时,这个最终的file是被压缩过的,但是中间的bitmap并没有被压缩。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);
七、线程优化:
使用线程池。为什么要用线程池?
1、从“为每个任务分配一个线程”转换到“在线程池中执行任务”
2、通过重用现有的线程而不是创建新线程,可以处理多个请求在创建销毁过程中产生的巨大开销
3、当使用线程池时,在请求到来时间 ,不用等待系统重新创建新的线程,而是直接复用线程池中的线程,这样可以提高响应性。
4、通过和适当调整线程池的大小 ,可以创建足够多的线程以使处理器能够保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或者失败。
5、一个App里面所有的任务都放在线程池中执行后,可以统一管理 ,当应用退出时,可以把程序中所有的线程统一关闭,避免了内存和CPU的消耗。
6、如果这个任务是一个循环调度任务,你则必须在这个界面onDetach方法把这个任务给cancel掉,如果是一个普通任务则可cancel,可不cancel,但是最好cancel
7、整个APP的总开关会在应用退出的时间把整个线程池全部关闭。
八、一些性能优化建议:
1)避免创建过多对象,造成频繁的gc
2)不要过多使用枚举,枚举占用的空间比整型大很多
3)字符串的拼接使用StringBuffer、StringBuilder来替代直接使用String,因为使用String会创建多个String对象,参考第一条。
4)适当使用软引用,(弱引用就不太推荐了)
5)使用内存缓存和磁盘缓存。
大致有6种方法
1.使用Android智能手机的语音到文本功能运行了Android 2.1或更高版本操作系统的手机都内置了一个语音识别系统,可以让用户通过语音来打字。在使用语音到文本功能时,用户只需点击屏幕键盘左下角的麦克风按键,或者从左至右轻扫整个键盘即可。上述任何一种操作方式都会弹出“现在请讲话(Speak Now)”的对话框。一旦这个对话框弹出,用户就可以开始说话了,系统会自动将用户所说的话变成文字。在其他任何地方,用户也可以使用语音到文本功能来操作Android手机。比如,用它来搜索设备:点选麦克风图标旁边的搜索框或长按搜索按钮,说出你要查询的内容,系统就能自行搜索了。Android的语音到文本系统还具有几个隐藏的命令,这些命令可以帮助用户发送短信。2.使用Vlingo应用程序进行语音解析如果用户想体验更强大的语音输入功能,那么Vlingo将是最佳选择,这款应用程序在Android商店上可以免费获得。Vlingo对Android自带的语音到文本功能进行了升级,使得用户可以用各种语音命令来操作手机。例如,单击手机触屏,用户就可以直接给任何个人或企业打电话,不管他们在不在你的联系人名单里(如果需要的话,可以将Vlingo当作一个自动查号台)。用户也可以编写并发送短信、电子邮件和微博消息,还可以搜索网络、获知方向、打开其它Android应用程序,所有这些任务只需用户说几句话就可以进行操作。为了使用Vlingo,用户可以点击主菜单上图标,也可以按手机上的搜索键,程序会自动转入语音输入功能。3.使用Google推出的“语音行动”应用程序就在几天前,谷歌紧随Vlingo的步伐,为Android手机推出了自己的语音控制应用程序——语音行动(Voice Actions),其功能非常强大。不过,该应用程序仅能运行在Android 2.2手机上。和Vlingo一样,语音行动是和手机的搜索键结合在一起的。按住搜索键,就可以通过该应用程序的语音命令对手机进行操作,也不需要再连接其他额外的硬件。语音行动和Vlingo具有一些相同的命令。但是,语音行动也有一些其他应用程序所不具有的特殊命令。语音行动可免费下载,但除了全新的摩托罗拉Droid 2手机之外,都必需手动进行安装。只要用户的手机运行的是Android 2.2系统,就能在Android商店上搜索到语音行动。4.使用扫屏输入法Swype如果用户不喜欢用语音操作手机的方式,在Android手机上仍然有许多高级的输入法可供选择。当下最流行的是扫屏输入法Swype——一款第三方应用软件,它可以取代Android内置的虚拟标准键盘。Swype输入法只需用户在要录入单词的几个字母之间滑行,无需敲击键盘。该应用程序的发明者声称,用户使用该系统打字的速度比用标准摸屏键盘快了20%到30%。现在,几款Android手机(包括Droid X和Droid 2手机)都预装了Swype输入法。那些手机上未预装该应用程序的用户,也可以获得限量的免费试用版。只需在Swype的网站上注册,您的名字就会出现在等候批准的申请人名单上。5.预测输入法SwiftKey接下来,我们要介绍的Android输入法有点接近超能感应了。SwiftKey,是目前许多人首选的一款输入法,它可以预测出用户即将输入的单词。下面是SwiftKey输入法的工作流程:SwiftKey输入法可以跟踪键入内容,并弹出预测的下一个单词。选择系统预测出的单词时,点击该单词或按空格键即可。这款应用程序的发明者声称,SwiftKey只用其他输入法80%的时间就能准确预测出用户下一个要输入单词的一至两个字符。甚至在用户打出下一个单词的首个字母之前,SwiftKey就能用其它输入法三分之一的时间根据上下文准确预测出整个单词。目前,SwiftKey输入法可以在Android商店上免费下载。6.盲打输入法BlindType如果你仍为不能在智能手机上准确点击触屏按键而苦恼,那么最后为你介绍的这款Android输入法正好可以满足你的需求。正如其字面意思,BlindType是一种可以在触屏手机上实现盲打的输入法。该应用程序的口号是:“无需准确的敲击键盘”。BlindType输入法可以调整至用户“心目中”的键盘,并对用户输入的内容进行预测和更正,即便是用户点错了键盘也没关系。这听起来很奇怪吧?去看看此款输入法的操作视频,你会有更为深刻的了解。BlindType输入法的发明者期望,在“不久的将来”Android手机可以运行该输入法,所以现在你不必着急,耐心的等待这个精确输入法的到来吧!
为什么安卓手机充电效率比苹果手机快很多?
而且不管是苹果手机还是安卓手机,标准充电器部分都是通用USB接口,两种充电器混用也不会有问题。快充技术兴起后,很多智能手机为了达到快充的效果,都加强了电压或电流。而正规的手机充电器是根据手机内部安装的芯片来输出电压/电流的,也就是说,手机需要多少功率,充电器就会输出多少功率。大功率手机充电器不会伤害手机。一些手机厂商为了兼顾不支持快充的手机,专门为充电器设计了两种不同的功率。比如华为手机原装的快充有5V/2A和9V/2A两种,在给不支持快充的手机充电时使用的电量更低。此外,OPPO的VOOC闪充会根据被充电手机的接口引脚自动判断是否支持快充,如果不支持则只输出低电量。所以用安卓快充给苹果iPhone充电不会有问题。不过,虽然大部分智能手机都可以混用充电器,但是有一种情况需要避免,那就是长时间使用低功率的充电器给支持快充的手机充电。比如手机可以用9V/2A功率充电,而你只用5V/1A的小功率充电器,充电器会一直处于饱和工作状态,导致自身温度升高,时间长了还是有一定风险的。再者,最好不要使用来历不明的充电器。一般正规手机的标准充电器都不便宜。苹果iPhone 6S原装充电器149元,华为快充也要69元。虽然小充电器这么贵,有一定溢价因素,但是原装充电器用料足,质量有保证。而一些没有品牌的充电器往往连正规的合格证都没有,内部元件也是用最便宜的下脚料做的。长期使用不仅会损坏手机电池,还会有自燃、漏电甚至爆炸的危险。如果你需要购买非原厂的充电器,一定要从正规渠道购买,比如像JD.COM、Suning.cn这样的正规网商。另外,购买的第三方充电器一定要有正规的国家3C认证标志:误区二:第一次使用手机,应该总是没电,自动关机后再充电12小时以上。因为现在大部分智能手机都不能换电池,而且大家都很在意电池寿命,所以很多用户会自动关机直到没电,然后充电12个小时以上,防止新手机的电池产生“记忆效应”,所谓“记忆效应”是指过去的镍镉电池用光电充满后不会充满,下次再充满的情况。但是现在的智能手机都是使用固态锂聚合物电池,没有所谓的记忆效应。他们反而最怕没电的情况。锂聚合物电池比较娇气,不仅怕热,还怕冷。比如iPhone在寒冷的天气下很多次都无法开机,因为苹果设计了一个温度开关来保护电池,一旦检测到环境温度过低或过高就会自动关闭。同时,固态锂聚合物电池一旦电量耗尽,内部锂离子活性会大大降低,对电池造成极大的损害。智能手机的电量最好始终保持在20%以上,尽量不要等到降到5%以下再充电。一旦智能手机电量耗尽,手机会自动关机。这时候给手机充电也可能遇到没反应的情况。这种情况不要慌,继续给手机充电就好。一般5到10分钟后手机会再次显示充电进度。误区三:充电的时候玩手机没问题。以前一般认为边充电边玩手机问题不大,因为那时候快充技术还没兴起,用充电器给手机充电时功率低,手机耗电比较低。充电时玩手机最多只会导致充电时间更长。但近两年,高通、联发科、三星、华为都提出了快充技术,提高了充电器的功率,将手机充电时间缩短到100分钟以内。这虽然提高了手机的充电效率,但也带来了一个问题:手机在快速充电时会明显发热。上一个问题提到了,智能手机电池对温度很敏感,过冷或过热都是不行的。因此,在快速充电时,智能手机的温度会升高。如果这个时候玩游戏什么的,身体的温度会进一步升高。手机温度一旦超过40摄氏度,就会对电池产生一定的影响。所以手机快充状态下最好不要玩。如果一定要用手机,就不要玩游戏或打开太耗费资源的应用,以免体温过高。误区四:用快充会伤电池。如前所述,目前的快充技术在充电时会导致手机温度升高,因此部分用户担心快充会损坏电池,故意选择功率较低的充电器代替原来的快充充电器,实现“慢充”。其实这种担心完全没有必要。无论是高通的QC快充还是OPPO的VOOC闪充,在推出之前都经过了无数次的测试,手机内置的IC电源管理芯片也会根据电池的充电情况来调节输入电流。比如现在的智能手机,前80%快充,后20%慢充,这是一种科学的快充方式。只要控制好电流强度,就不会对手机电池造成损害。总结智能手机的充电技术在不断发展,所以我们的充电习惯也在不断变化。不过给手机充电只要记住一点就不会有大问题:无论是原装的还是非原装的手机充电器,一定要选择正规厂家的合格产品,通过质量认证。千万不要用来历不明的充电器给手机充电。