java.lang.IllegalStateException:尝试重新打开已经关闭的对象

2023-12-01

我试图弄清楚为什么我偶尔会收到 IllegalStateException。我找不到任何好的示例来展示如何使用线程加载列表来查询 SQLite 数据库。我在下面包含了我的代码。大多数时候它工作正常,但偶尔我会收到 IllegalStateException。

我在我的另一个活动(即 ExpandableListActivity 的实例)中也遇到了类似的异常。该异常指出“尝试重新查询已经关闭的游标”。

有人可以告诉我执行此操作的正确方法,以免导致任何错误吗?我更愿意使用游标而不是将所有数据复制到内存中。如果我无法弄清楚这一点,那么我将不得不将其全部加载到内存中。

我认为这个问题与 startManagingCursor(Cursor) 以及数据库连接在 onDestroy() 中关闭的事实有关。 请帮忙
-- tale

public class MyListActivity extends ListActivity {
    private MyCursorAdapter adapter;
    private SQLiteDatabase db = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            new RetrieveCursorTask(this).execute((Void[]) null);
        } catch (Exception e) {
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // Null out the cursor. 
        if (adapter != null) {
            adapter.changeCursor(null);
            adapter = null;
        }

        if (db != null && db.isOpen()) {
            db.close();
        }
    }

    private class RetrieveCursorTask extends AsyncTask<Void, Void, Cursor> {
        private Context ctx;

        public RetrieveCursorTask(Context ctx) {
            this.ctx = ctx;
        }

        @Override
        protected Cursor doInBackground(Void... params) {
            Cursor cursor = null;
            DbHelper helper = new DbHelper(ctx);

            try {
                db = helper.getReadableDatabase();
                cursor = db.query("users",
                    new String[] {
                        DbHelper.ID_COLUMN,
                        DbHelper.UID_COLUMN
                    }, 
                    null, null, null, null, null);
                startManagingCursor(cursor);
            } catch (Exception e) {
            }
            return cursor;
        }

        @Override
        protected void onPostExecute(Cursor cursor) {
            super.onPostExecute(cursor);

            if (cursor != null) {
                try {
                    adapter = new MyCursorAdapter(ctx, cursor);
                } catch (Exception e) {
                }
                setListAdapter(adapter);
            } 
        }
    }

    private class MyCursorAdapter extends CursorAdapter {
        private Context ctx;

        public MyCursorAdapter(Context context, Cursor c) {
            super(context, c);
            this.ctx = context;
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            // ...
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            // ...
        }
    }
}

调查异步查询处理程序如果你想按照你想要的方式查询数据库。

您的任务 RetrieveCursorTask 在单独的线程上运行,因此当您的 Activity 被销毁时,您的 AsyncTask 可能仍在后台运行,但由于您在主 Activity onDestroy 中关闭了光标,因此在 AsyncTask 返回后可能会再次重新查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.IllegalStateException:尝试重新打开已经关闭的对象 的相关文章

  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 错误:(23, 13) 无法解决:com.google.android.gms:play-services:11.2.0“安装存储库和同步项目”不起作用

    我正在尝试在我的 Android 应用程序中获取位置并更新到服务器 这是我的 Gradle 代码 我在这里包含了compile com google android gms play services 11 2 0 这条线是从文档中 htt
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐

  • 如果我 fork() 然后执行 execv(),谁拥有控制台?

    我正在编写一个 Linux 应用程序 如果我打电话会发生什么fork 然后运行一个接受控制台输入的应用程序 考虑下面的代码 int process id fork if process id 0 this is the parent pro
  • 如何在字符串中包含尚未定义的变量? PHP

    为了执行更少的数据库查询和代码的清晰性 我想在字符串中包含一个尚未定义的变量 稍后在页面中 将声明变量并打印和评估字符串 我该怎么做呢 str This variable is delicious array array Apple Pin
  • 与 Java 7 相比,运行相同递归代码的相同线程在 Java 8 中似乎消耗更多的堆栈内存

    我在 stackoverflow 网站中询问有关 java堆栈溢出 的问题 对特定输入进行一些递归函数调用的特定线程运行良好Oracle Java 7 64 位 对于已配置的堆栈大小 228k Xss228k 但是 同一线程对同一输入运行相
  • 从不同表中减去两个字段

    我的查询是如何从 SQL 中的不同表中减去两个值 例如 我想要一列减去用户的空闲假期天数 这些天数必须是您在申请中要求的天数与您每年休假的天数之间的差值 我有两张桌子 sec users具有以下字段的表 pk user login dias
  • 如何使用 Google Apps 脚本代码创建草稿电子邮件(来自 985)?

    In 第985期 评论 29 中一位名为 yurec 可能 的开发人员提供了一些代码 用于在 Google Apps 脚本中创建草稿 文本 电子邮件 其他一些人感谢他所做的出色工作 并说它已经过测试并且有效 我对如何使用它以及代码的哪些部分
  • Python:通过迭代列表列表将项目附加到列表

    我是一个从 C 过渡到的 Python 新手 我基本上正在尝试实现与 C 中的数组指针数组等效的逻辑 我想通过迭代这些列表的列表来将一个项目附加到一堆列表的末尾 我有以下代码 data 10 20 30 list1 list2 list3
  • Swift - 如何确定 iOS 应用程序的最佳“部署目标”

    在 Xcode 上 您可以自行决定 部署目标 但您可能会选择太旧的版本来稳定运行应用程序 因为您的代码中的某些方法已被更高版本的 iOS 支持 例如 选择部署目标 8 0 但当您在 iOS 版本 8 0 的设备上运行应用程序时 应用程序崩溃
  • 为什么使用 Float(arc4random()) / 0xFFFFFFFF 而不是 drand()

    我是 Swift 新手 刚刚在教程中看到这段代码用于生成随机角度 func random gt CGFloat return CGFloat Float arc4random 0xFFFFFFFF func random min CGFlo
  • c# Clipboard返回null,但不能为空

    我正在尝试获取单击时生成并粘贴到剪贴板中的链接 我尝试了我能找到的一切 但我总是收到 null 即使当我将链接手动粘贴到记事本中时 我也明白了 我对每个定义的数据格式尝试了此代码 但所有内容都返回 null string clipboard
  • 如何交换两张卡而不改变其他卡的位置

    I have images in grid form something like this 我很清楚react dnd 它使用悬停来获取位置并相应地交换 我想要的是 Swap 1 with 4 and 4 with 1 怎么了 移动图像
  • 在 render 中调用 setState 是不可避免的

    React 文档指出render函数应该是pure这意味着它不应该使用this setState但是 我相信当状态依赖于 远程 时 即 ajax 调用的结果 唯一的解决方案是setState 里面一个render功能 就我而言 我们的用户应
  • 采用材料设计的自定义搜索栏

    我在布局中有一个搜索栏 用于自定义对话框首选项 我更改了 styles xml 以使用新的材质设计 它之所以有效 是因为它更改了我的设置的文本和复选框 但我无法将颜色应用到我的搜索栏 仅当我在活动中放置搜索栏时它才有效 这意味着我必须在自定
  • 将每小时的动物园时间序列输入函数 stl()

    在你问之前 是的 我需要显示这么多数据 stl 需要两个周期的数据 在本例中 一个周期有 24 个值 因此 stl 至少需要 48 个值 另外 来自 stl 帮助 这应该是 ts 类的对象 其频率大于 1 我正在升级一些旧的计算 以便我的数
  • 如何在 Angular 中将输入值作为参数传递给路由器

    我相信我想做的事情是微不足道的 但我尝试了很多不同的事情 但无法弄清楚 我有两个组件 SearchComponent and DetailsComponent显示搜索结果 路线模块 const routes Routes path comp
  • 后台工作进程还是线程?

    我有一个 Winform 应用程序 它在网格视图中列出了一批发票 用户选择批次并单击 生成发票 按钮 该过程大约需要 4 5 分钟 当它运行时 我将有一个选框进度条 并且想禁用所有按钮 我应该使用后台工作进程还是创建一个新线程来运行此任务
  • 使用具有特定标识的应用程序池运行 ASP.net 项目会产生“(403) Forbidden”

    尝试从 Visual Studio 启动 ASP net 项目时收到此错误消息 它不运行 Unable to start debugging on the web server The remote server returned an e
  • 检测android中启动了哪个应用程序

    如何检测用户在我的应用程序中启动了哪个应用程序 即当用户启动 Whatsapp 时 即使我的应用程序没有在前台或后台运行 我的应用程序也应该收到通知 远足信使通过无障碍服务实现了相同的功能 我怎么解决这个问题 提前致谢 根据运行应用程序的
  • 为什么 Cocoa-Touch 类 ivars 具有前导下划线字符?

    这次会议有什么目的吗 有一些开发人员使用以下约定通过以下方法 隐藏 ivars interface private NSString myString property nonatomic retain NSString myString
  • 如何在 Unity 检查器中根据其他变量值隐藏变量

    我如何根据统一检查器中的其他变量值隐藏变量 基本上想象一下 如果我有一个名为 CanSprint 的布尔值和一个名为 SprintSpeed 的浮点数 那么我想这样做 以便当布尔值为真时 浮点数显示 但当布尔值为假时 浮点数隐藏 这只是为了
  • java.lang.IllegalStateException:尝试重新打开已经关闭的对象

    我试图弄清楚为什么我偶尔会收到 IllegalStateException 我找不到任何好的示例来展示如何使用线程加载列表来查询 SQLite 数据库 我在下面包含了我的代码 大多数时候它工作正常 但偶尔我会收到 IllegalStateE