2

Web サービスからマスター データをダウンロードするために使用される非同期タスクを拡張する DownLoadData クラスがあります。SQLite データベースには 10 個の masters テーブルがあり、それぞれに個別の Web サービス呼び出しが必要です。したがって、DownLoadData タスクには 10 個のスレッドがあります。それぞれがそれぞれの Web サービスを呼び出し、データを受け取り、それをそれぞれのテーブルに挿入します。

でトランザクションを開始し、_onPreExecute()_すべてのスレッドが終了したかどうかを確認した後、でトランザクションを終了し_onPostExecute()_ます。

問題は、このアプローチが ICS までのバージョンで完全に機能したことです。JellyBean では動作しないようです。アプリは、60 秒ごとに次の logcat メッセージでハングします。

04-02 14:53:23.263: W/SQLiteConnectionPool(1409): The connection pool for database '/data/data/com.c2info.liveorder/databases/DB' has been unable to grant a connection to thread 117 (AsyncTask #2) with flags 0x1 for 30.010002 seconds.

04-02 14:53:23.263: W/SQLiteConnectionPool(1409): Connections: 0 active, 1 idle, 0 available.

次のようにトランザクションを開始および終了します。

public LocalDatabase beginTransact() {

  mdbHelper = new DatabaseHelper(ctx);
  mdb = mdbHelper.getWritableDatabase();
  execSQL("BEGIN");
  return this;
}

public void endTransact() {

  execSQL("END");
  mdbHelper.close();
}

また、すべてのスレッドで同じ DB インスタンスを使用しています。

4

1 に答える 1

0

JellyBean の問題は、個々のスレッドをすべてのスレッドの単一のトランザクションではなく、単一のトランザクションとして扱うことで解決しました。

于 2014-02-11T04:26:48.493 に答える