1

私のアプリには、UI スレッドで実行される操作がそれほど頻繁ではなく、長時間 (最大 3 秒) かかります。その間、アニメーションの「待機」表示を表示したい。たとえば、回転スピナー。実際の進行状況を表示する必要はありません。固定速度のアニメーションだけです。

長い操作中にポップアップするカスタムダイアログを作成しましたが、このレイアウトになっています

<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinner"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

回転しないのが難点。UI スレッドがビジーであっても、どうすれば回転させることができますか?

イベントのチェーンを作成してインクリメントしようとしましたが、おそらく UI スレッドがビジーであるため、2 つのイベントしか取得できません。

// In the custom dialog class. mProgressBar is the ProgressBar in the layout.
// Called externally once when the dialog is shown
public void tick() {
    mProgressBar.incrementProgressBy(10);
    mProgressBar.postDelayed(new Runnable() {
        @Override
        public void run() {
            // Not a recursion since it's done in a future event.
            tick();
        }
    }, 100);
}

このアニメーションを実現する簡単な方法は何ですか? フレームごとのアニメーションの方が簡単ですか?

4

3 に答える 3

1

アンドロイド:あなたはそれを間違っています...

UI スレッドで長時間かかる処理を行うと、アプリがフリーズします。UI スレッドをロックしているため、何もアニメーション化することはできません (幸運にも 2 回目盛りを取得できます)。タッチやキーの押下にアプリを応答させることもできず、ユーザーには ANR 画面が表示されます (ひどいユーザー エクスペリエンス)。UI スレッドで実行時間の長いタスクを実行しないでください。実行する正当な理由はありません。

表示される内容はタスクの結果に依存するため、UI スレッドでタスクを実行したいと思いますか? その場合、メイン スレッドにスピナーを表示し、バックグラウンドでタスクを実行し (AsyncTask はまさにこのために設計されました)、タスクが終了した後にのみ UI を更新します。恐ろしいユーザーエクスペリエンスなしで同じ最終結果。

于 2012-03-26T17:35:02.417 に答える
1

AsyncTask を使用http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html UI スレッドで実行しているためスピンしません

于 2012-03-26T16:39:22.317 に答える
1

xml またはコードで android:indeterminate プロパティに true 値を設定する必要がある場合があります

于 2012-03-26T16:40:13.690 に答える