これがケースです:私のアプリでは、他の特別なデバイスとの通信に使用されるサービスがあります。この通信の途中で、アプリでデータベースにクエリを実行して、2 番目のデバイスとの通信を続行するために必要なデータを取得する必要があります。ここでは、2 つのパラメーターを持つ rawQuery を使用しています。クエリはそれほど複雑ではないので、実際にデータベースでビューをクエリしています。その結果、約50 行と25 列が返されるはずです。
問題は、このクエリをサービス (同じスレッド) から呼び出すと、UI が6 秒間ブロックされることです。動作が止まった長い操作を知らせるアニメーションがあります。
一方、(UI スレッドから移動するために) AsyncTask の doInBackground でまったく同じクエリを呼び出すと、アニメーションは問題なく流れますが、同じ量のデータ クエリに対して、テストしている電話に応じて25 秒から1 分かかるようになりました。 . (ほぼ 1 分で Intel CPU を搭載した新しい Motorola に挑戦)
私は時間を測定し、どこで多くの時間を失いましたか (クエリとデータベースは両方の電話でまったく同じであるため)、このすべての時間がカーソルへの最初のアクセスで無駄になっています。私の場合 c.moveToFirst() ..
私の質問は、SQL ではなく Android 指向です。私のアプリでは、データ、データベースで満たされた、すでに完全に統合されているためです。
アイデアはありますか?
編集: 私が抱えている問題に対してさまざまな解決策を試してみましたが、ここに興味深いことがあります:クエリを持つ Runnable で別のスレッドを使用すると、時間が数秒に短縮されます (すべてが UI スレッドで実行されるのとまったく同じです) スレッド t =新しいスレッド (RunnableWhichHoldQuery); //その後、スレッド t を開始します。
なぜAsyncTaskがそのように振る舞うかはまだわかりません..何が起こっているのかをよりよく理解したいので、説明に興味があります..アイデアを持っている皆さんに感謝します..