在handleMessage方法里 访问数据库 调用getWritableDatabase()出错
时间: 2024-03-22 08:38:45 浏览: 51
在Android开发中,getWritableDatabase()方法需要在UI线程之外的线程中调用,否则会导致主线程阻塞,从而引起ANR(Application Not Responding)错误。为了避免这种情况,你可以在Handler中使用异步任务或者线程池等机制来执行数据库操作。
具体来说,你可以在Handler的handleMessage方法中创建一个异步任务,然后在异步任务中调用getWritableDatabase()方法进行数据库操作。例如,以下代码演示了如何在Handler中使用异步任务来执行数据库操作:
```java
public class MyHandler extends Handler {
private Context mContext;
public MyHandler(Context context) {
mContext = context;
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_DB_OPERATION:
new DbAsyncTask().execute();
break;
// other cases
}
}
private class DbAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
MyDatabaseHelper dbHelper = new MyDatabaseHelper(mContext);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// perform database operation
db.close();
return null;
}
}
}
```
在上面的代码中,当Handler接收到MSG_DB_OPERATION消息时,它会创建一个异步任务DbAsyncTask并执行它。在异步任务中,我们可以安全地调用getWritableDatabase()方法进行数据库操作,而不会阻塞主线程。
阅读全文