1

私の活動は、アナウンスをダウンロードして表示することです(アナウンスWebサービスから)。UIの応答性を維持するために、バックグラウンドスレッドで次のアクションを実行します。

1)XMLをアップロードします(データはXMLに保存されます)、

2)XMLを処理します。

3)画像をアップロードします。

さらに、UIスレッドの応答性を維持するために、UIスレッドとバックグラウンドスレッドの優先順位を変更します。

メインスレッド:

Thread.currentThread().setPriority(10);

バックグラウンドスレッド:

Thread.currentThread().setPriority(1);

各アナウンスはTableRowに配置され、各TableRowはハンドラーを使用してTableViewに配置されます。ユーザーがTableViewをスクロールし、テーブルの最後に到達しようとすると、新しい行が追加され、次のアナウンス用のHTTP-GETが送信されます(+パーシング(XPathを使用)+画像のアップロード+テーブルの行にコンテンツを入力)。

私の問題:

アップロードと解析が進行中の場合、ユーザーインターフェイスは部分的にしか応答しません(ユーザーがTableViewをスクロールすると、それぞれ0.1〜0.5秒の遅延が発生します)。

データのアップロード/処理に依存しない、絶対にスムーズなスクロールを作成したいと思います。

間違った方法で何が行われ、ここで他に何ができるでしょうか?たとえば、ハンドラーの操作の数を減らすと、応答性が向上するはずです...多分そのように。ただし、そこには重くてリソースを消費する指示はありません。


アップデート

TableLayoutの代わりにListViewを使用してコードを書き直しました。前者の方がかなり高速であるためです(結局のところ、私はそれを知りませんでした)。しかし、XML処理とListViewスクロールが同時に行われていると、まだスパイクがあります。私は2つの実験を行いました:

1)すべてのバックグラウンドプロセスを削除しました-下にスクロールすると新しい行がListViewに追加されましたが、それらの行のデータは処理されませんでした(したがって、空のままでした)-このようなバリアントはうまく機能し、スパイクはなく、UIは完全に応答しました。

2)2番目の実験は、ListView更新の呼び出しを削除することでした(XMLファイルは処理されましたが、見つかったデータはListViewアダプターに渡されませんでした)-そのときは急上昇しました。したがって、これらのスパイクはバックグラウンドスレッドによるものであり、UI更新呼び出しによるものではないと結論付けます。バックグラウンドスレッドの優先度をメインスレッドの優先度よりも低くした場合、どのようにしてアプリの速度を低下させることができますか?

Thread.currentThread().setPriority(some_int);

スレッドの優先順位を設定する正しい方法は?

4

2 に答える 2

0

ある時点で、UI スレッドはこれらの新しいオブジェクトを追加し、メモリ内に新しい UI オブジェクトを作成して、描画リストに追加する必要があります。UI で非表示のテーブル行を多数作成することで、必要なだけのメモリを事前に割り当てることができます。これにより、UI スレッドがメモリを再割り当てして新しい TableRows 用のスペースを確保しようとしている可能性があるため、いくつかの問題が解決する可能性があります。

また、バックグラウンド スレッドでThread.yield()を使用することもできます。これは、このスレッドの準備ができていることを Android OS に通知し、必要に応じて UI スレッドの再開を許可します (UI スレッドがアイドル状態の場合は、即座に再開します)。

于 2012-01-25T11:07:55.880 に答える
-1

UI スレッドで I/O を行っていない場合、説明した遅延はおそらくレイアウト パスです。レイアウトの最適化に集中することをお勧めします。ListView を使用していない理由はありますか?

于 2012-01-25T11:21:25.080 に答える