如何在asyncTask

时间:2016-09-11 20:06:02

标签: android multithreading android-asynctask

我一直在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中执行此操作?

1 个答案:

答案 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