⑴ 用 Kotlin 写 android 3—数组,集合与字符串
相比 java,在 Kotlin 里数组的写法变化还是挺大的,用 xx-Array 的命名规则来声明一个数组类型,并用 xx-ArrayOf 来进行初始化。
例如整型数组,IntArray 类型,IntArrayOf 是初始化方法,以此类推其他基础类型也差不多。
要注意的是,String 类型的数组声明有所不同,Array<String> 表示一个字符串数组,arrayOf 是初始化方法。由此也可以得出,像我们自己定义的一些模型类要是想声明一个数组应该是和 String 一个用法。
虽说数组的声明写法上有差别,但在数组元素的基本使用上可以说相差不大。
Kotlin 里的容器类分三大类,并且每个类又分为不可修改和可修改两种,这就好比 val 和 var 的变量声明一样。默认情况是不可修改的,要想对容器类进行类似增,删,改的操作就要声明可修改,即要加上前缀 Mutable-。和数组初始化方法类似,容器类的初始化方法也是 xx-Of 系列,xx 表示具体容器类型,例如如果是可变集合初始化那就是 MutableSetOf。
遍历
三者都能进行 for-in 循环,
三者都能进行迭代器循环遍历,
除此之外三者还能进行 forEach 循环遍历,不过对 Map 来说有 API 24 的版本限制,其次虽说写法简单,但可能实用性不那么强,毕竟实际开发中不会说仅做个简单遍历吧。所以我觉得记住上面两种较通用的写法就够了。
字符串的常规方法没有太大的改变,我们依然可以用 indexOf, subString, replace, split 等方法。对于类型转换,Kotlin 中的字符串提供了 to-xxx 系列的方法,例如字符串转整型 toInt,字符串转浮点型 toFloat 等。
另外一个就是 Kotlin 里用 ${} 替换了 Java 中的 String.format 来用于字符串模板效果。
⑵ Android性能优化总结
常用的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)使用内存缓存和磁盘缓存。
⑶ android 怎样向string中加入字符串
一般我们的字符串资源文件都是放在values/strings.xml文件中,比如
[java] view plain
<string name="back">返回</string>
<string name="login">登录</string>
但是有时候需要用到拼接,比如 登录名: XXX,这里XXX是变化的。这时候我们可能会想到拼接。其实也可以使用格式化方式处理。比如
[java] view plain
<string name="alert">I am %1$d years old</string>
注意%1$d 表示一个参数,d表示整数,%1&s表示字符串,如果有第二个参数的话数字往上加,如%2$s
在代码中使用的话:
[java] view plain
int nAge=23;
String sAgeFormat = getResources().getString(R.string.alert);
String sFinalAge = String.format(sAgeFormat, nAge); 多个参数时
[java] view plain
<string name="alert2">My name is %1$s , I am form %2$s</string>
代码中使用的话:
[java] view plain
String sInfoFormat = getResources().getString(R.string.alert2);
String sFinalInfo=String.format(sInfoFormat, sName, sCity);
⑷ android开发中如何讲一个list数组转换成String字符串的形式
public class SplitTest {
public static void main(String args[]) {
String str = "a1.png,a2.png,a3.png";// 原始字符串
String[] arrayStr = new String[] {};// 字符数组
List<String> list = new ArrayList<String>();// list
arrayStr = str.split(",");// 字符串转字符数组
list = java.util.Arrays.asList(arrayStr);// 字符数组转list
String[] storeStr = list.toArray(new String[list.size()]);// list转成字符数组
/* 输出字符数组的值 */
for (String s : arrayStr) {
System.out.println(s);
}
System.out.println("-------------");
/* 输出list值 */
for (String s : list) {
System.out.println(s);
}
System.out.println("-------------");
for (String s : storeStr) {
System.out.println(s);
}
System.out.println("-------------");
}
}
⑸ android TextView控件如何显示数组内容
通过数组循环显示到TextView上。
1、获取数组
2、获取TextView组件
3、循环拼接数组成字符串,显示到TextView中
示例:
String[]arr={"a","b","c"};//定义一个数组,模拟获取到的数组
TextViewtv=(TextView)findViewById(R.id.xxxx);//获取一个TextView
Stringct="";//定义一个字符串
for(inti=0;i<arr.length;i++){
ct=ct+arr[i];//数组拼接成字符串
}
tv.setText(ct);//在TextView中显示数组内容。