![](/img/trans.png)
[英]Android: onRetainNonConfigurationInstance() deprecated?
[英]Android - using database with onRetainNonConfigurationInstance
package com.commonsware.cwac.wakeful.demo;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.util.Log;
import android.widget.SimpleCursorAdapter;
public class FlightListActivity extends ListActivity {
private SQLiteDatabase database;
private String fields[] = {BaseColumns._ID, "name", "flights", "distance"};
private SimpleCursorAdapter dataSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(ACTIVITY_SERVICE, "onCreate flights");
database = (SQLiteDatabase) getLastNonConfigurationInstance();
if (database == null) {
database = getData();
Log.v(ACTIVITY_SERVICE, "first load data");
}
Cursor data = database.query("pilots", fields, null, null, null, null, null);
dataSource = new CustomCursorAdapter(this, R.layout.row, data, fields, new int[] { R.id.id, R.id.name, R.id.flights, R.id.distance });
setListAdapter(dataSource);
}
protected SQLiteDatabase getData() {
DataBaseHelper myDbHelper = new DataBaseHelper(this.getApplicationContext());
return myDbHelper.openDataBase();
}
@Override
public Object onRetainNonConfigurationInstance() {
Log.v(ACTIVITY_SERVICE, "reusing data");
final SQLiteDatabase myData = database;
return myData;
}
@Override
protected void onDestroy() {
database.close();
super.onDestroy();
}
}
好的,所以我試圖通過將數據庫存儲在onRetainNonConfigurationInstance上來保留數據庫,但是如果不使用onDestroy方法關閉數據庫,則會收到運行時錯誤。
我沒有得到什么,如果我在onDestroy中關閉了數據庫,那么我需要在某個地方重新打開它,但是那不是打敗了堅持它的對象嗎?
這是用戶旋轉設備時重用數據庫的最佳方法嗎?
總的來說,不必擔心這些事情-Android在執行此類操作時實際上非常高效。 一切都必須從頭開始重新創建,因此在大多數情況下,只要讓它發生就可以。
與對數據庫的查詢相比,打開數據庫的成本最低,這可能會返回大量結果。 如此說來,這就是Cursor
所在,它旨在以高效的方式處理查詢的結果。
至於ListViews
它們在任何一次都只有有限數量的“項目”,這些內容在滾動ListView
時會被回收,並且在方向更改期間,通常需要使用不同數量的可見列表項重新繪制ListView
。
onRetainNonConfigurationInstance()
的使用是為更復雜的場景設計的一種特殊情況-可能保留用戶正在繪制的畫布,或者保持某些會話狀態(身份驗證令牌等)的“實時”網絡連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.