Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用之——不要將數據存儲在Application類中

Android應用之——不要將數據存儲在Application類中

編輯:關於Android編程

前言:最近在開發中發現了一個比較嚴重的問題,當我們將應用按home鍵放入後台運行,一段時間後,當我們再次打開應用的時候,十有八九會出現一個NullPointException的空指針異常,根據logcat的日志,就會定位到一個去全局性到變量去,這是什麼原因呢?原來,是因為我們我們將很多數據放入了application中作為全局變量,導致了問題的產生,下面來說下為什麼不能將數據放在application中。


一、application類的簡介 Application和Activity,Service一樣是android框架的一個系統組件,當android程序啟動時系統會創建一個 application對象,用來存儲系統的一些信息。一般情況下,系統會默認幫我們創建一個application類,我們不需要在其中進行任何操作,程序會自動創建。當如果需要創建自己的Application,在其中進行一些操作,也很簡單,創建一個類繼承 Application並在manifest的application標簽中進行注冊(只需要給Application標簽增加個name屬性把自己的 Application的名字定入即可)。
 
其中MyApplication類就是我們自定義的一個類,繼承自Application類
public class MyApplication extends Application {	
	public String name;
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
	}	
}

二、application中為什麼不能存儲數據
下面我們來看一個簡單的示例: 我們在application繼承類中寫一個set get變量的方法,然後通過第一個activity利用application的set方法來設置這個變量的值,在另一個activity中取得這個值,並將其轉換為大寫顯示出來。代碼如下: MainActivity:
public class MainActivity extends Activity {

	private MyApplication application;
	private Button btnName;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		application = (MyApplication) getApplication();
		application.setName(YangLiang);
		
		btnName = (Button) findViewById(R.id.btn_name);
		
		btnName.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this, ShowNameActivity.class);
				startActivity(intent);
			}
		});
		
	}
}
MyApplication類
public class MyApplication extends Application {
	public String name;
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
	}
}
另一個activity,顯示內容
public class ShowNameActivity extends Activity {

	private MyApplication app;
	private TextView tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.showname);
		app = (MyApplication) getApplication();
		String name = app.getName();
		tv = (TextView) findViewById(R.id.tv_showname);
		tv.setText(name.toLowerCase());
	}
	
}
打開應用後,進入ShowNameActivity界面中,然後按home鍵進入後台,一段時間後,再次打開demo,就出現了空指針異常
logcat中的錯誤日志 \
定位到了這句代碼:
tv.setText(name.toLowerCase());
name在這個時候已經為空了
這是什麼原因呢? 因為當應用程序在後台運行的時候,當我們將應用程序切入到後台或者當內存不足時,系統可能會將當前應用的application進程干掉, 當我們再次從後台將應用切換到前台的時候,系統會重新生成一個application類,這個時候,我們在顯示的activity中調用
app = (MyApplication) getApplication();
String name = app.getName();
tv.setText(name.toLowerCase());
上面的name就是空的,因此會出現空指針異常,也就是說,我們存儲在application中的數據,有可能會因為程序運行在後台的時候導致application的銷毀和重建進而導致數據的丟失,這對於程序來說是致命的,直接導致空指針異常的出現,程序崩潰。

三、有什麼更好的辦法? 1、通過intent來傳遞數據,而不是將數據放在全局變量application中,當然這麼做是有局限性的,並不是所有地方都適合用intent來傳遞數據,也並不是所有類型的數據都適合用intent來傳遞,關於intent的數據傳遞,讀者可參考其他資料。
2、將數據進行持久化操作,寫入文件,shareprefrence,數據庫等等各種能夠安全保存數據的方法。然後在需要使用數據的地方進行文件讀取操作。
3、在所有需要使用此類數據的地方進行非空的判斷,然後進行相應的操作。
四、總結:不要輕易在application類中進行數據的存儲操作,application類中應當做的是進行一些全局性的配置的初始化操作,而數據的存儲應該使用前面推薦的幾種方法。
 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved