我一直在UI线程上进行数据库事务,并且它没有任何明显的UI冻结,因为数据库很小,但我担心因为数据库事务不应该在UI线程上完成。
我在这里发现,AsyncTask是解决这个问题的最佳解决方案,但我没有看到一个实际的例子。而且我从未使用过Asynctask类。
这是我从片段onCreateView
调用的方法:
private void getBookDb () {
Log.d(TAG, "getBookDb called");
mDatabase = mBookHelper.getWritableDatabase();
Cursor cursor = mDatabase.rawQuery("SELECT * FROM " + BookEntry.NAME, null);
if (cursor != null && cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
BookItem bookItem = new BookItem();
String id = cursor.getString(cursor.getColumnIndex(BookEntry.ID));
String url = cursor.getString(cursor.getColumnIndex(BookEntry.URL));
bookItem.setProductId(id);
bookItem.setUrl(url);
}
bottomRoot.setVisibility(View.VISIBLE);
} else {
Log.d(TAG, "Database is empty");
emptyRoot.setVisibility(View.VISIBLE);
}
if (cursor != null) {
cursor.close();
}
mDatabase.close();
mBookAdapter.notifyItemRangeChanged(0, mBookAdapter.getItemCount());
}
请告诉我如何在AsyncTask中执行此操作?
答案 0 :(得分:2)
1)AsyncTask并不困难,Google和它有很多教程。
2)了解AsyncTask后,将您对doInBackground()
的调用放入AsyncTask的doInBackground()
方法。
3)尝试重构您的代码,这样您就不必在onPostExecute()
结束并调用onPostExecute()
之前更新任何UI元素,然后在onPreExecute()
中进行所有UI更新{1}}方法,在UI线程上运行。此外,您可以使用onPreExecute()
方法更新用户界面,因此请尝试在onPostExecute()
和doInBackground()
中完成所有用户界面工作..但是..
4)如果必须,您可以使用此代码在AsyncTask的runOnUiThread(new Runnable() {
@Override
public void run() {
// Runs in the UI thread
}
});
方法中实际更新UI元素:
ContentValues
5)此外,我认为在SQLite数据库中放置/读取信息的更好,更安全和“正确”的方法是使用rawQuery()
而不是{{1}},如下所示:
https://developer.android.com/training/basics/data-storage/databases.html#WriteDbRow