androidlistview優化
㈠ 如何解決listview性能問題
在ListView的使用中,有時候還需要在裡面加入按鈕等控制項,實現單獨的操作。也就是說,這個ListView不再只是展示數據,也不僅僅是這一行要來處理用戶的操作,而是裡面的控制項要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發現可以添加,但是卻無法獲得焦點,點擊操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。
▲圖4-35 BaseAdapter中的方法
使用BaseAdapter必須寫一個類繼承它,同時BaseAdapter是一個抽象類,繼承它必須實現它的方法。BaseAdapter的靈活性就在於它要重寫很多方法,看一下有哪些方法,如圖4-35所示為繼承自BaseAdapter的SpeechListAdapter所實現的方法,其中最重要的即為getView()方法。這些方法都有什麼作用呢?我們通過分析ListView的原理來為讀者解答。
當系統開始繪制ListView的時候,首先調用getCount()方法。得到它的返回值,即ListView的長度。然後系統調用getView()方法,根據這個長度逐一繪制ListView的每一行。也就是說,如果讓getCount()返回1,那麼只顯示一行。而getItem()和getItemId()則在需要處理和取得Adapter中的數據時調用。那麼getView如何使用呢?如果有10000行數據,就繪制10000次?這肯定會極大的消耗資源,導致ListView滑動非常的慢,那應該怎麼做呢?通過一個例子來講解如何在使用BaseAdapter的時候優化ListView的顯示。例子中將上一節中的ImageView換成Button,並且處理Button的點擊事件,其中對ListView的顯示做了優化。
布局文件和上一例類同,讀者可以在光碟的工程目錄中查看,這里只給出Activity類。
001 publicclass MyListViewBase extends Activity {
002
003 private ListView lv;
004 //定義一個動態數組
005 ArrayList<HashMap<String, Object>>listItem;/** Called when the activity is first created. */
006
007 @Override
008 publicvoid onCreate(Bundle savedInstanceState) {
009 super.onCreate(savedInstanceState);
010 setContentView(R.layout.main);
011
012 lv = (ListView) findViewById(R.id.lv);
013 MyAdapter mAdapter = new MyAdapter(this);//得到一個MyAdapter對象
014 lv.setAdapter(mAdapter);//為ListView綁定Adapter
015 /**為ListView添加點擊事件*/
016 lv.setOnItemClickListener(new OnItemClickListener() {
017 @Override
018 publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,longarg3) {
019 Log.v("MyListViewBase", "你點擊了ListView條目" + arg2);//在LogCat中輸出信息
020 }
021 });
022 }
023 /**添加一個得到數據的方法,方便使用*/
024 private ArrayList<HashMap<String, Object>> getDate(){
025 ArrayList<HashMap<String, Object>> listItem = newArrayList<HashMap<String,Object>>();
026 /**為動態數組添加數據*/
027 for(inti=0;i<30;i++)
028 {
029 HashMap<String, Object> map = new HashMap<String, Object>();
030 map.put("ItemTitle","第"+i+"行");
031 map.put("ItemText", "這是第"+i+"行");
032 listItem.add(map);
033 }
034 return listItem;
035 }
036 /** 新建一個類繼承BaseAdapter,實現視圖與數據的綁定
037 */
038 privateclass MyAdapter extends BaseAdapter {
039 private LayoutInflater mInflater;//得到一個LayoutInfalter對象用來導入布局
040
041 /**構造函數*/
042 public MyAdapter(Context context) {
043 this.mInflater = LayoutInflater.from(context);
044 }
045
046 @Override
047 publicint getCount() {
048 return getDate().size();//返回數組的長度
049 }
050
051 @Override
052 public Object getItem(int position) {
053 returnnull;
054 }
055
056 @Override
057 publiclong getItemId(int position) {
058 return 0;
059 }
060
061 /**書中詳細解釋該方法*/
062 @Override
063 public View getView(finalint position, View convertView, ViewGroup parent) {
064 ViewHolder holder;
065 //觀察convertView隨ListView滾動情況
066 Log.v("MyListViewBase", "getView " + position + " " + convertView);
067 if (convertView == null) {
068 convertView = mInflater.inflate(R.layout.item,null);
069 holder = new ViewHolder();
070 /**得到各個控制項的對象*/
071 holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
072 holder.text = (TextView) convertView.findViewById(R.id.ItemText);
073 holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
074 convertView.setTag(holder);//綁定ViewHolder對象
075 }
076 else{
077 holder = (ViewHolder)convertView.getTag();//取出ViewHolder對象
078 }
079 /**設置TextView顯示的內容,即我們存放在動態數組中的數據*/
080 holder.title.setText(getDate().get(position).get("ItemTitle").toString());
081 holder.text.setText(getDate().get(position).get("ItemText").toString());
082
083 /**為Button添加點擊事件*/
084 holder.bt.setOnClickListener(new OnClickListener() {
085 @Override
086 publicvoid onClick(View v) {
087 Log.v("MyListViewBase", "你點擊了按鈕" + position);//列印Button的點擊信息
088 }
089 });
090
091 return convertView;
092 }
093
094 }
095
096 /**存放控制項*/
097 publicfinalclass ViewHolder{
098 public TextView title;
099 public TextView text;
100 public Button bt;
101 }
102 }
運行效果如圖4-36所示。還需要注意的是,Button會搶奪ListView的焦點,需要將Button設置為沒有焦點。設置非常簡單,只需要在xml的Button標簽下加入一行:android:focusable=「false」代碼就可以了。
㈡ android listview 按照網上的優化方法提示 空指針訪問:變數 convertView 在此位置只可為空值 就是else後
在getView 的方法中,需要每次判斷 convertView 是否為空,應為有可能listview滑動過快,導致布局來不及釋放重用。如果convertView為空,則按照正常的流程,convertView賦值,如convertView = findViewById(id);確保此值不為空。
㈢ android ListView 每個item載入大量的文本滑動會出現內存溢出咋辦咋辦
這個設計到listview優化問題。
首先,listview必須嚴格按照convertView及viewHolder格式書寫,這樣可以基本保證數據最優。
其次,如果自定義Item中有涉及到圖片等等的,一定要做圖片優化。bitmap釋放可以不做。
第三,盡量避免在BaseAdapter中使用static 來定義全局靜態變數,這個影響很大,static是Java中的一個關鍵字,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的實例。所以用static修飾的變數,它的生命周期是很長的,如果用它來引用一些資源耗費過多的實例(比如Context的情況最多),這時就要盡量避免使用了..
第四,盡量避免在ListView適配器中使用線程,因為線程產生內存泄露的主要原因在於線程生命周期的不可控制。
最後,如果上述你都做到的話,你的listview已經優化的很好了。針對你的問題,你的listview控制項高度是否設置為fill_parent,因為warp會導致listview滑動中無限計算自身高度。你的文本載入是否做過線程以及多次重復載入的問題處理。你的item中變數是否多次無限生成新的內存對象等等。
㈣ listview的優化不正確的是
listview的優化不正確的是Item的布局層級越多越好。listview的優化分為兩類,布局優化和數據優化,Item的布局層級越多,xml文件解析並顯示到界面上,這是非常消耗資源的。
㈤ 針對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性能優化的淺談
㈥ Recyclerview多種場景下的優化
因為APP設計的原因,Recyclerview是我在Android中最常用的組件,我們公司的APP幾乎每一個頁面都會包含至少一個Recyclerview,本篇文章主要介紹一些我個人在工作中總結、收集的recyclerview優化經驗。
1.不要在onBindViewHolder中設置點擊事件和耗時操作
Recyclerview的onBindViewHoler主要負責將數據與holder綁定,它在列表滑動時會不停的被調用。如果在onBindViewHolder中設定監聽操作,會導致已經的綁定點擊事件的view,被重復綁定監聽操作。
點擊事件的監聽可以在onCreateViewHolder中設定。一些會創建新對象的操作,也需要根據實際情況考慮從onBindViewHolder中遷移到onCreateViewHolder。
注意: onBindViewHolder運行在UI線程中,如果進行了耗時操作,會導致頁面卡頓。並且onBindViewHolder中只應該進行數據的綁定,而不應該進行數據的處理和計算等操作。
2.Recyclerview嵌套Recyclerview的優化
Recyclerview嵌套Recyclerview最經典的運用就是,一個縱向滑動的列表內部的每個item是一個可以橫向滑動的Recyclerview,比如說GooglePlay。
這種情況可以使用LinearLayoutManager.setInitialPrefetchItemCount()設定
橫向列表初次顯示時可見item的個數。如果橫向滑動的View中數據量很少,並且不需要橫向刷新時,也可以考慮使用HorizontalScrollView實現。
關於這個API的官方文檔翻譯如下:
如果將此值設置為大於此視圖中可見的視圖數可能會導致不必要的綁定工作,並且會增加創建和活動使用的視圖數。
3.多個RecycerView共用RecycledViewPool
在大多數APP中都有這樣一種場景,一個ViewPager中包含多個Fragment,而Fragment中主體是Recyclerview,並且Recyclerview中item view的布局是相同的。例如 微博等
這種情況下,Recyclerview可以設定統一的緩存池用來提高性能。
新建緩存池:
設定緩存池:
4.精確的更新數據使用DiffUtil
在Recyclerview中提供了多種數據數據刷新方式
雖然有了這些刷新方式,但是實際開發中,存在這樣一種情況,新數據集與舊數據集僅有一部分數據存在差異。
例如:刷新一個聯系人列表,聯系人列表中部分聯系人的頭像有變化,但是姓名和手機號碼等信息未發生變化。這種情況以往都是使用notifyDataChanged方法刷新全部數據,但是刷新全部數據的會導致整個布局重繪,Recyclerview中針對這種情況還提供了另一種粒度更小的刷新方式 DiffUti
這里不打算去講DiffUtil的具體用法,只需要記住DiffUtil的使用場景即可: 列表中存在多個Item的數據需要刷新,但是新數據集與舊數據集存在重復的情況
5.靈活設定setHasFixedSize
在Recyclerview中使用以下方法時,會觸發requestLayout()
requestLayout()會重新計算item的大小,如果item的布局文件已經將寬高設為固定大小,可以設定setHasFixedSize(true),來避免Recyclerview重新計算item的大小。
6.優化Item的布局
布局優化是個老生長談的問題,本質上就是減少嵌套,ConstraintLayout是google推出的一個用於減少布局嵌套的新layout,但是在Recyclerview中使用ConstraintLayout會導致cpu使用率上升,暫時不推薦使用,不過ConstraintLayout 2.0版本已經進入beta測試,期待後續會有優化。
7.數據非常少時,使用ListView
不知道你有沒有考慮過這樣的問題,RecyclerView用已經如此強大,用得人也越來越多,為什麼最新的Android系統中ListView依然沒有被標注為"過時"。
RecyclerView重新設計了緩存機制,新的緩存機制更加強大,更適合處理大量數據的顯示,但是這種緩存機制會占據更多的內存,當一個列表頁面實際數據項非常少的時候,ListView往往比RecyclerView更合適。
㈦ 優化listview 有哪些方法
ListView幾乎在每個應用中都會用到。用ListView易於展現一些如聯系人、菜單等tems信息。這好像可以理所當然地認為Android應該有現成封裝好的方式來展現這類數據,最新的實現版就是RecyclerView。它被構建用於高效重復利用views,而不是每次當某個Viewitem進入屏幕時重新創建它。在RecyclerView之前,我們一般使用ListView,而且在今天ListView仍然被廣泛使用。雖然ListView也回收views,但它卻維持一個空間作為Android中一個最misconfigured的views。我們知道,這個話題在之前已經討論了很多,但是我今天在這篇博客提及它,是因為在今天我們仍然有很多人在使用ListView時姿勢不正確。下面是LisView的一個所謂標准寫法的ArrayAdapter實現代碼段。@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);ViewrowView=inflater.inflate(R.layout.view_test_row,parent,false);TextViewtestName=(TextView)rowView.findViewById(R.id.text_view_test_name);TextViewtestDesc=(TextView)rowView.findViewById(R.id.text_view_test_desc);//modifyTextViews,;}像這樣寫一個AdapterView,當你的list一次性顯示在屏幕上時這種寫法並沒有什麼問題,但是當擁有大量的items而且每個item的view都非常復雜的時候。這將引發性能問題,上面代碼片段裡面的方法非常耗性能。當用戶滑動屏幕的時候,對於每個子view都要通過LayoutInflater類加裝一遍,並且每次都會調用findViewById()來尋找組件。每次findViewById()被調用的時候,View各層次都會遍歷一次直到找到對應的ID,對於每個子View都必須這樣去找!如果用戶滑動手速比較快的話,就可能出現明顯的卡頓現象。為了解決這個問題,我們可以用一個static的類來關聯我們之前未曾用到的convertView。staticclassViewHolder(){TextViewtestName;TextViewtestDesc;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewrowView=convertView;//.if(convertView==null){LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);rowView=inflater.inflate(R.layout.view_test_row,parent,false);ViewHolderviewHolder=newViewHolder();viewHolder.testName=(TextView)rowView.findViewById(R.id.text_view_test_name);viewHolder.testDesc=(TextView)rowView.findViewById(R.id.text_view_test_desc);rowView.setTag(viewHolder);}ViewHolderholder=(ViewHolder)rowView.getTag();//.testName.setText("Test"+position);holder.testDesc.setText("Thisisnumber"+position);returnrowView;}但是,convertView又是什麼東東呢?它可以運行ListView跳過某行(row)為了顯示內容而需要的一些設置,它是某個當前正退出屏幕的子view。我們可以復用這個子view來顯示新的行(row)。當最初顯示ListView的時候,一切都是正常初始化的。由於沒有任何views可被復用,所以convertView是null。此時,view會被重新載入,但是TextViews組件被找到之後會被保存到一個ViewHolder對象中。我們可以通過調用setTag()和getTag()方法來將數據保存到view中,之後如果需要可以從中取出數據。這個改變看起來也許沒什麼大的區別,但是當我們的views更復雜、數量的時候,其效率差別就會非常明顯了。我們開發者們,最想做的一件是可能就是做出一個擁有非常棒的用戶體驗感的項目。上IT藍豹看用戶體驗源碼。
㈧ android中listview新能優化常用方法有哪些
主要是優化getivew方法里的圖片載入。
另外:listview已經被淘汰了,google推出recyclerView替代它,具體用法可以搜索,鑒於你們提問題的幾乎不怎麼會找答案,我替你搜了個 http://www.cnblogs.com/tiantianbyconan/p/4232560.html
㈨ 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)使用內存緩存和磁碟緩存。
㈩ 為什麼我的listview背景是黑色的優化問題
要使用android:cacheColorHint="@null" 和android:listSelector="@null" 是listview除去背景色,ListView是常用的顯示控制項,默認背景是和系統窗口一樣的透明色,如果給ListView加上背景圖片,或者背景顏色時,滾動時listView會黑掉,原因是,滾動時,列表裡面的view重繪時,用的依舊是系統默認的透明色,顏色值為#FF191919,要改變這種情況,只需要調用listView的setCacheColorHint(0),顏色值設置為0,或者xml文件中listView的屬性Android:cacheColorHint="#00000000"即可,滾動時,重繪View的時候就不會有背景顏色。android:listSelector="#00000000"進行上面的設置之後,ListView點擊item時就沒有任何現象了,android:listSelector="@null"不可以實現。自定義listview的時候,當你不使用android:cacheColorHint=「#00000000」會出現下面選中一個空間黑色底色的情況,破壞整體美觀度