如何在子线程中查询数据库?

qq_16545017 2018-07-14 01:11:50
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
ListView.setAdapter(adapter);


红米Note5Plus(RAM:4GB)可正常运行,
红米Note3(RAM:3GB)闪退。
已定位到问题出现在以上代码。

个人考虑是,读取(或查询)数据库可能比较费时,
需在线程中执行。
请问以上代码如何修改为在子线程中执行呢?不胜感激!
...全文
517 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
雕·不懒惰 2018-07-18
  • 打赏
  • 举报
回复
引用 10 楼 qq_16545017 的回复:
[quote=引用 9 楼 qq_33451426 的回复:]
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==0x110){
ListView.setAdapter(adapter);
}
}
};

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
handler.sendEmptyMessage(0x110);
}
}.start();


The local variable adapter may not have been initialized[/quote]

大哥 adapter没初始化啊,这你都不知道,你得把adapter定义全局的
Krisez 2018-07-17
  • 打赏
  • 举报
回复
创建一个handler
子线程更新数据完后
handler.sendMessage 通知然后handler里的方法进行操作数据ui
qq_16545017 2018-07-17
  • 打赏
  • 举报
回复
引用 9 楼 qq_33451426 的回复:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==0x110){
ListView.setAdapter(adapter);
}
}
};

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
handler.sendEmptyMessage(0x110);
}
}.start();


The local variable adapter may not have been initialized
雕·不懒惰 2018-07-17
  • 打赏
  • 举报
回复
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==0x110){
ListView.setAdapter(adapter);
}
}
};

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
handler.sendEmptyMessage(0x110);
}
}.start();
qq_16545017 2018-07-15
  • 打赏
  • 举报
回复
引用 5 楼 z979451341 的回复:
[quote=引用 4 楼 qq_16545017 的回复:]
[quote=引用 2 楼 z979451341 的回复:]

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
ListView.setAdapter(adapter);

}
}.start();


子线程不能更新UI线程控件,ANR……[/quote]
Handler通知一下就行了[/quote]

请问如何用Handler通知啊?谢谢!
键盘舞者113 2018-07-14
  • 打赏
  • 举报
回复
大兄弟,你去把《疯狂学Android 》 ,《第一行代码》都看一下,demo照着打一下,基础必须学好,要不然以后问题很多
键盘舞者113 2018-07-14
  • 打赏
  • 举报
回复
引用 4 楼 qq_16545017 的回复:
[quote=引用 2 楼 z979451341 的回复:]

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
ListView.setAdapter(adapter);

}
}.start();


子线程不能更新UI线程控件,ANR……[/quote]
Handler通知一下就行了
qq_16545017 2018-07-14
  • 打赏
  • 举报
回复
引用 2 楼 z979451341 的回复:

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
ListView.setAdapter(adapter);

}
}.start();


子线程不能更新UI线程控件,ANR……
zhuailhw123 2018-07-14
  • 打赏
  • 举报
回复
开一个子线程
键盘舞者113 2018-07-14
  • 打赏
  • 举报
回复

new Thread{
@Override
public void run() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cur = db.query("i", null, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.list, cur, new String[]{"_id", "name", "favourite"}, new int[]{R.id.textView1, R.id.textView2, R.id.textView3}, 0);
ListView.setAdapter(adapter);

}
}.start();
r00_a2lBUR 2018-07-14
  • 打赏
  • 举报
回复
要在子线程查询数据库,前提是要会开一个子线程

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧