⑴ 用 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中顯示數組內容。