gpt4 book ai didi

android - 旋转设备时崩溃 - 生命周期问题

转载 作者:行者123 更新时间:2023-11-29 02:06:02 26 4
gpt4 key购买 nike

我在之前的问题中被告知,如果设备旋转,我不需要维护数据库,因为它使用本地数据库。

我认为我至少可以维护我的列表的数据源。我在尝试执行此操作时遇到问题,因为我收到一条错误消息,指出未在数据库上调用 close() 。不过,我在 onDestroy 中调用了 close。

谁能看出我哪里出错了?我只是想通过维护数据以在用户旋转设备后重新填充列表来改善用户体验。

另一件让我感到困惑的事情是我的日志语句按以下顺序出现:

  • 创建航类
  • 第一次设置
  • 重用数据源
  • 破坏 Activity

我原以为破坏 Activity 会在重用数据源之前发生。

package com.testing.flights;

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");

datasource = (SimpleCursorAdapter) getLastNonConfigurationInstance();

if (datasource == null) {
database = getData();
datasource = getCursor();
Log.v(ACTIVITY_SERVICE, "first setup");
}

setListAdapter(datasource);
}

protected SQLiteDatabase getData() {
DataBaseHelper myDbHelper = new DataBaseHelper(this.getApplicationContext());
return myDbHelper.openDataBase();
}

protected CustomCursorAdapter getCursor() {
Cursor data = database.query("pilots", fields, null, null, null, null, null);
final CustomCursorAdapter mysource = new CustomCursorAdapter(this, R.layout.row, data, fields, new int[] { R.id.id, R.id.name, R.id.flights, R.id.distance });
return mysource;
}

@Override
public Object onRetainNonConfigurationInstance() {
Log.v(ACTIVITY_SERVICE, "reusing datasource");
final SimpleCursorAdapter myData = datasource;
return myData;
}

@Override
protected void onDestroy() {
Log.v(ACTIVITY_SERVICE, "destroying activity");
database.close();
super.onDestroy();
}

}

LogCat:

04-03 16:22:55.900: E/SQLiteDatabase(1860): close() was never explicitly called on database '/data/data/com.testing.flights/databases/club' 

最佳答案

我相信正在发生的事情是操作系统优先于创建新 Activity 而不是销毁旧 Activity。因为不能保证 onDestroy 运行(它可以被终止),所以通常在 onResume() 中打开您的数据库,然后在 onPause() 中自行清理方法。 (onPause 不会被杀死,至少在 honeycomb + 中是这样)。由于您现在所拥有的,新 Activity 正在尝试打开一个已经打开的数据库(我的猜测)。没有尝试保留这样的游标,我不是 100% 认为这会解决您的问题,但使用生命周期的那一部分是非 View 设置类型的正常情况。

关于android - 旋转设备时崩溃 - 生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com