7

この構造のアクティビティがあります:

FrameLayout
   ProgressBar
   ViewStub

ViewStub は別のスレッドで Fragment をインフレートします。必要なのは、フラグメントの読み込み中に進行状況を表示することです。問題は、スタブが膨張している間、ProgressBar が回転しないことです (私の場合、約 0.5 秒: 重いフラグメントです) 私はすべてを試しました: ビューの表示/非表示、無効化、ViewSwitchers での表示など、何もViewStub が膨張するとすぐに回転し始めます。膨張中に UI がフリーズしているように見えますが、別のスレッドで実行しても改善されないようです。私は何をすべきか?

4

2 に答える 2

4

フラグメントは UI スレッドにロードする必要があり、UI がフラグメントでビジーであるため、ProgressBar は回転しません。フラグメント内のデータ読み込みを UI のものに分離する必要があります。正確に何が実行されているかをテストして確認し、フラグメントが高速に起動しないようにします。ユーザーにプログレスバーを表示しながらデータをロードするためにローダーを使用します (フラグメント内)。はい、進行状況をフラグメントのレイアウトに移動し、そこからすべてを制御します。これは、アクティビティがフラグメントの読み込みがいつ完了したかを知る必要がないためです。アクティビティはそれを気にする必要はありません。

于 2015-06-10T16:38:07.803 に答える
1

基本的に、@Luksprog が彼のコメントで言ったことは正しいです。ランナブルを UI スレッドにポストするだけです。やれば効くかも

new Thread(new Runnable() {
    @Override
    public void run() {
        viewStub.inflate();
        initFragment();
    }
}).start()

@Luksprog も述べているように、バックグラウンド スレッドでビューをインスタンス化するのは悪い習慣です。したがって、おそらく最善の解決策は、.inflate() 呼び出しを外部 (メイン スレッド上) に移動し、バックグラウンド スレッドから initFragment() を呼び出して、すべての面倒な作業をそこに置くことです。

于 2015-06-16T23:59:59.513 に答える