2016-09-11 8 views
0

私は自分のデータベースのトランザクションをUIスレッドで行っていますが、データベースが小さいのでUIが凍結することなく動作していますが、データベーストランザクションは存在しないため心配ですUIスレッドで行われます。asyncTaskでgetWritableDatabase()を実行する方法

ここでは、AsyncTaskがこれを解決する最適な解決策であることがわかりましたが、実際の例は見当たりませんでした。さらに、私はAsynctaskクラスを使ったことがありません。

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でこれを行う方法を私を見ることができますしてください:

これは私がフラグメントのonCreateViewから呼び出す方法ですか?

+0

あなたは単に非同期の 'doInBackground'から' getBookDb() 'を呼び出す必要があります。これはアプリケーション上で同様のことがあり、それは完全に動作します。 –

+0

@TiagoOliveira' getBookDb() 'のUIスレッドを更新しています。 'doInBackground'から呼び出すのは良い考えですか? UIスレッドを 'doInBackground'から更新する予定ではないと思ったのですか? – X09

+1

あなたは 'doInBackground'でデータを収集して返し、' onPostExecute'でUIを更新します –

答えて

2

1)AsyncTaskは難しくありません.Googleやそれにはたくさんのチュートリアルがあります。

2)AsyncTaskを理解したら、getBookDb()への呼び出しをAsyncTaskのdoInBackground()メソッドに入れます。

3)あなたはdoInBackground()終了するまで、任意のUI要素を更新する必要はありませんし、onPostExecute()への呼び出しが行われるようにコードをリファクタリングして、UI上で動作onPostExecute()方法、にすべてのUIの更新を行うようにしてください糸。また、あなたはonPreExecute()方法でUIを更新し、そうonPreExecute()onPostExecute()にすべてのUIのものをやろう..しかし..

4)あなたはあなたに持っている場合はAsyncTaskのdoInBackground()におけるながら、実際のUI要素を更新することができますすることができますこのコードを使用することにより方法:また

runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 

        // Runs in the UI thread 
       } 
      }); 

5)、私が示すように、SQLiteのDBに読み/情報を掲載するためのより良い、より安全な、そして「正しい」方法は、むしろrawQuery()よりContentValuesを使用することであると信じていますここに: https://developer.android.com/training/basics/data-storage/databases.html#WriteDbRow

関連する問題