2012-01-10 1 views
0

Androidアプリケーションには2つのアクティビティがあります。遅れのないバックグラウンドスレッドでビューのデータをロードするときのベストプラクティス

アクティビティAはアイテムのリストを示します。 アクティビティBには、特定のアイテムに関する詳細が表示されます。

詳細は大規模SQLiteデータベースから読み込まれます。データを生成するために使用されるクエリは、合理的な電話機で約250〜500ミリ秒かかります。

私の質問は、素晴らしいユーザーエクスペリエンスを提供しながらデータを読み込むためのベストプラクティスです。

現在、アクティビティBは作成時にAsyncTaskを実行します。タスクが完了すると、多数のビューが作成されて画面に追加されます。 UIスレッドにはデータはロードされません。

ユーザーには、アクティビティBが素敵な標準ズームアニメーションで開き、1秒後にデータが表示されます。それは、少しばかげたIMOに見えます。

もう1つの方法は、データをUIスレッドにロードすることです。これを適切なタイミングで行うと、250ミリ秒間選択されたリスト項目で画面がフリーズし、データがロードされ、標準のズームアニメーションでビューが変更されますが、すでに入力されているビューにズームしています。それはもっとよく見えますが、理想的ではないUIスレッドをブロックしています。

新しいビューがまだ準備されていないときに素敵なトランジションを達成する最良の方法は何ですか?

+0

データの読み込み中にアクティビティAの上に進捗ダイアログを表示し、キャンセル可能性を追加します。さらに重要なのは、別のスレッドでロードすることです。これがネットワーク操作であるため、応答を受信することに決して頼るべきではなく、操作を簡単にキャンセルする可能性があります。 IMHOはそうです。 – harism

+0

これはネットワーク操作ではありません。 –

答えて

2

のいずれかがデータをロードするタスクのprogress dialogを入れて、あなたがしていない場合..

あなたは... intervally UIにデータベースから結果のデータを更新するために

protected void onProgressUpdate(Integer... progress) { 
     //this runs in UI thread so its safe to modify the UI 
     myTextField.append("finished call " + progress); 
    } 
をご AsyncTaskonProgressUpdate()方法を使用することができます

•onProgressUpdate - バックグラウンドタスクからpublishProgressが呼び出されるたびに呼び出され、進行状況をUIに報告するために使用されます。あなたはLIMITと、データベースから大量のデータをフェッチするためにあなたのselect queryに返される結果のバウンド数のデータベースからデータをフェッチするためのsqlite databaseOFFSET句を使用することができます。また

..

例:

Select * from Animals LIMIT 100 OFFSET 50 
+0

ありがとう、実際には私のユースケースでは本当に良いアイデアです。画面の最も重要な部分が非常に迅速に読み込まれます。 –

+0

よろしくお願いします。 –

+0

@ user370305ええ、私は何日もあなたを探していました。私は[チャット](http://chat.stackoverflow.com/rooms/1531/casual-chat)を持っているいくつかの部屋で訪問を支払うことを望みます。 –

関連する問題