Android 充气viewstub时ProgressBar未设置动画

Android 充气viewstub时ProgressBar未设置动画,android,android-progressbar,viewstub,Android,Android Progressbar,Viewstub,我有一项与此结构相关的活动: FrameLayout ProgressBar ViewStub ViewStub在单独的线程中膨胀片段。我需要的是在片段加载时显示进度。 问题是ProgressBar在存根膨胀时没有旋转(在我的例子中,大约半秒钟:它是一个沉重的碎片) 我已经尝试了所有的方法:显示/隐藏视图、失效、在ViewSwitchers中显示它们……等等,什么都不起作用,只要ViewStub膨胀,它就开始旋转,就像ui在膨胀时冻结了一样,但在另一个线程中执行似乎没有任何改进。

我有一项与此结构相关的活动:

FrameLayout
   ProgressBar
   ViewStub
ViewStub在单独的线程中膨胀片段。我需要的是在片段加载时显示进度。 问题是ProgressBar在存根膨胀时没有旋转(在我的例子中,大约半秒钟:它是一个沉重的碎片) 我已经尝试了所有的方法:显示/隐藏视图、失效、在ViewSwitchers中显示它们……等等,什么都不起作用,只要ViewStub膨胀,它就开始旋转,就像ui在膨胀时冻结了一样,但在另一个线程中执行似乎没有任何改进。
我该怎么办?

片段必须加载到UI线程上,因为UI忙于片段,所以ProgressBar不会旋转。
您需要将片段中的数据加载与UI内容分离。我会测试和检查到底是什么在运行,并防止片段快速启动,我会使用一个加载程序来加载数据,同时向用户(在片段内部)呈现一个progressbar。是的,将进度移动到片段的布局,并从那里控制所有内容,因为我不想让活动知道片段何时完成加载,活动不应该关心这一点。

如果调用viewStub.post()的话,@Luksprog在评论中说的基本上是正确的这不会在后台线程上运行post内部的代码。它所做的只是将runnable发布到UI线程。如果你这样做,它可能会起作用

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

尽管@Luksprog也指出了这一点,但在后台线程上实例化视图是不好的做法。因此,也许最好的解决方案是将.inflate()调用移到外部(主线程上),然后从后台线程调用initFragment(),并将所有繁重的工作放在那里。

从主活动的UI线程调用进度,然后将所有繁重的工作移到单独的线程或异步任务中。我该怎么办您可以改进视图层次结构,使其更浅、更小。当然,除了基本列表之外的任何数据都应该加载到后台线程中。它已经加载到单独的线程中,并且视图层次结构尽可能优化。问题是,膨胀ViewStub是否总是加载到UI线程上,即使我将其放在单独的线程中?因为它看起来像是冻结了UIS,你如何准确地在后台线程上膨胀
ViewStub
?ViewStub.post(new Runnable(){@Override public void run(){android.os.Process.setThreadPriority(android.os.Process.thread_PRIORITY_LOWEST);ViewStub.inflate();initFragment();}});