Android開發經驗小節2:迴圈利用你的小對象

來源:互聯網
上載者:User

在上一篇中提出的原則都是為了避免建立不必要的對象。對於佔用資源較多的對象,可以在程式初始化中建立,並一直使用,比片資源。對於一些不變的對象,如字串、常數,可以採用靜態常量的辦法。但我們開發過程中還會遇到另一種情況,有些對象雖然佔用資源少,但使用頻率高(比如記錄螢幕點位置座標的對象),對於這種情況應該如何處理呢?

這個問題其實比較複雜,要具體情況具體分析,但還是有一些規律可循。

原則1:建立對象池迴圈利用小對象

例如如下類:

 

1 publicclass TestPoint
2 {
3 publicint mX;
4 publicint mY;
5 public TestPoint(int x,int y)
6 {
7 set(x,y);
8 }
9
10 publicvoid set(int x,int y)
11 {
12 mX=x;
13 mY=y;
14 }
15 }

 

使用時:

 

 

publicvoid test()
{
for(int i=0;i<10000;i++)
{
TestPoint p=new TestPoint(i,i);
。。。
}
}

 

通過分析,以上代碼會建立10000個TestPoint新對象,這當然是不合理的,可以用如下辦法最佳化:

 

 

1 publicclass TestPoint
2 {
3 publicint mX;
4 publicint mY;
5 public TestPoint(int x,int y)
6 {
7 set(x,y);
8 }
9
10 publicvoid set(int x,int y)
11 {
12 mX=x;
13 mY=y;
14 }
15
16
17 /**
18 * 對象池
19 */
20 privatestatic ArrayList<TestPoint> sPoints=null;
21
22 /**
23 * 從對象池中擷取一個對象,如果空池則建立新對象,並初始化
24 * @param x 橫座標
25 * @param y 縱座標
26 * @return 對象
27 */
28 publicstatic TestPoint popPoint(int x,int y)
29 {
30 TestPoint p=null;
31 if(sPoints!=null&& sPoints.size()>0)
32 {
33 p=sPoints.remove(0);
34 p.set(x, y);
35 }
36 else
37 {
38 p=new TestPoint(x,y);
39 }
40 return p;
41 }
42
43 /**
44 * 向對象池歸還一個對象,如果空池則先建立池
45 * @param p 要歸還的對象
46 */
47 publicstaticvoid pushPoint(TestPoint p)
48 {
49 if(sPoints==null)
50 {
51 sPoints=new ArrayList<TestPoint> ();
52 }
53
54 sPoints.add(p);
55 }
56
57 }

 

在使用時:

 

 

publicvoid test2()
{
for(int i=0;i<10000;i++)
{
TestPoint p=TestPoint.popPoint(i, i); //擷取對象
。。。
TestPoint.pushPoint(p); //歸還對象
}
}

 

這樣,由於使用過的對象歸還給了對象池,當需要時優先從池中擷取對象,實際建立對象的次數將明顯下降。

 

原則2:給你的對象池設一個上限

前面的代碼也有局限性,例如如果程式的邏輯造成其對象擷取峰值較高,池中的對象將或很多,當程式對象擷取需求減少時,池中的對象就成為了佔用記憶體的累贅了。一個可行的辦法是,為對象池中對象數設定一個上限,當歸還對象時發現池中對象已經達到這個上限了,就不再將其放入池中。只要這個上限設定合理,池記憶體佔用和GC釋放記憶體壓力可以找到一個較好的平衡點。

原則3:保護好你的對象池

這裡需要強調的是,對於多線程共用的對象池,應該對所有訪問對象池的靜態方法進行嚴格的線程保護,因為ArrayList的操作還是比較費時且多線程共同對其訪問是是有線程衝突的。

 

小結:

對象池的使用可以對頻繁使用的小對象進行有效迴圈利用,如果運用合理,可以極大地提升程式的運行效率和降低程式的資源佔用。但請相信,沒有普遍適用的最優方案,必須具體問題具體分析。

 

作者:汪峰 www.otlive.cn

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.