私の活動は、アナウンスをダウンロードして表示することです(アナウンス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);
スレッドの優先順位を設定する正しい方法は?