国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android static靜態(tài)成員變量的使用誤區(qū)

static 修飾的靜態(tài)變量,使用很方便,在不同的類和包中都可以使用,在虛擬機中單獨占用內存,沒錯,這些都是它們的優(yōu)點,不過在項目上線后,才發(fā)現(xiàn)static有一些不太好的地方。
在查看項目的崩潰信息時,發(fā)現(xiàn)很多地方莫明的出現(xiàn)空指針異常的錯誤,經過排查,發(fā)現(xiàn)可能就是static的問題。我們在項目中,將用戶的信息也就是User對象保存成了一個靜態(tài)變量,而在報錯的地方,也都發(fā)現(xiàn)有使用過這種變量,因此,可以大致推斷出與這種保存的方式有一定的聯(lián)系。同時,有不少用戶反映在打開應用的情況下,接個電話或者長時間待機后,再回到應用也會出現(xiàn)崩潰的現(xiàn)象,而這些崩潰都與靜態(tài)變量的空指針有關系。
如此來說的話,static靜態(tài)修飾在Android的開發(fā)中是不是很危險?或許我們可以說如果是static User u = new User();這樣定義的話,那么應該不會有太大問題,而如果是static User u;這樣定義的話,那么很可以會出現(xiàn)NULL的現(xiàn)象。當然,前面的方法里面的屬性也可能會現(xiàn)空的情況,但是這個可以用封裝來避免空指針。另外靜態(tài)常量還是很好用的。
那么應該如何保存登錄或者全局的信息呢?根據(jù)Google官方的推薦以及百度到的各位大神的推薦,我們應該盡量使用繼承自Application的自定義類,在我們繼承的類中定義需要全局使用的變量,并通過getApplicationContext()來獲取和保存相關的變量即可。實例:

  1. package com.jony.bitmaptest;  
  2.   
  3. import android.app.Application;  
  4. import android.os.Handler;  
  5.   
  6. public class MyAplication extends Application{  
  7.     // 引發(fā)異常:在一些不規(guī)范的代碼中經??吹紸ctivity或者是Service當中定義許多靜態(tài)成員屬性。這樣做可能會造成許多莫名其妙的null pointer異常。  
  8.       
  9.     // 異常分析:Java虛擬機的垃圾回收機制會主動回收沒有被引用的對象或屬性。在內存不足時,虛擬機會主動回收處于后臺的Activity或Service所  
  10.     // 占用的內存。當應用再次去調用靜態(tài)屬性或對象的時候,就會造成null pointer異常  
  11.       
  12.     // 解決異常:Application在整個應用中,只要進程存在,Application的靜態(tài)成員變量就不會被回收,不會造成null pointer異常  
  13.     private static final int MSG = 0X1;  
  14.     private Handler mHandler = new Handler(){  
  15.         public void handleMessage(android.os.Message msg) {  
  16.             switch (msg.what) {  
  17.                 case MSG:  
  18.                       
  19.                     break;  
  20.   
  21.                 default:  
  22.                     break;  
  23.             }  
  24.         };  
  25.     };  
  26.     private String action;  
  27.     private String username;  
  28.     private String password;  
  29.     @Override  
  30.     public void onCreate() {  
  31.         // TODO Auto-generated method stub  
  32.         super.onCreate();  
  33.     }  
  34.     public String getUsername() {  
  35.         return username;  
  36.     }  
  37.     public void setUsername(String username) {  
  38.         this.username = username;  
  39.     }  
  40.     public String getPassword() {  
  41.         return password;  
  42.     }  
  43.     public void setPassword(String password) {  
  44.         this.password = password;  
  45.     }  
  46.     public String getAction() {  
  47.         return action;  
  48.     }  
  49.     public void setAction(String action) {  
  50.         this.action = action;  
  51.     }  
  52.     public Handler getHandler(){  
  53.         return mHandler;  
  54.     }  
  55. }  

在Activity或Service中的使用方法:

  1. MyApplication application = (MyApplication) this.getApplicationContext();   

Application是與應用同時存在的,也就是應用在它就在,并不會被GC給莫名其妙的回收掉,因此,使用此方法更加安全。

鏈接地址

http://www.2cto.com/kf/201205/133951.html

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Action對象
[z]android 應用程序Activity之間數(shù)據(jù)傳遞與共享的幾種途徑
Android的intent之間復雜參數(shù)的傳遞
Android NDK C++開發(fā)注意事項總結
C#判斷程序是否運行的方法
基于TestNG+Mockito及自動裝配注解的Spring MVC集成測試
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服