ProgressBar在充气ViewStub时无法动画化。

7

我有一个这样的结构的Activity:

FrameLayout
   ProgressBar
   ViewStub

ViewStub可以在单独的线程中填充一个片段。我需要的是在片段加载时显示进度。 问题是ProgressBar在视图存根膨胀时不会旋转(在我的情况下大约半秒钟:这是一个沉重的片段) 我尝试了一切:显示/隐藏视图,使其无效,在ViewSwitchers中显示它们等等,但都没有用,一旦ViewStub膨胀,它就开始旋转,就像UI在膨胀期间被冻结,但在另一个线程中执行它似乎并没有改善。 我该怎么办?

从您的主活动的UI线程调用进度,然后所有繁重的工作都应该移动到单独的线程或asyncTask中。 - erik
你应该怎么做? - 优化视图层次结构,使其更加扁平化和小巧。当然,除了基本的列表数据以外,任何其他数据都应该在后台线程上加载。 - user
它已经在一个单独的线程中加载,并且视图层次结构已经尽可能地优化了。问题是,即使我将ViewStub放在单独的线程中,它是否总是在UI线程上加载?因为它似乎会冻结UI。 - MariusBudin
你如何在后台线程上展开 ViewStub - user
viewStub.post(new Runnable() { @Override public void run() { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST); viewStub.inflate(); initFragment(); } }); - MariusBudin
那个方法(post())明确表示可运行的将在用户界面线程上运行,所以你不会在另一个后台线程上执行任何操作。其次,你不应该在后台线程上实例化视图,因为它们会创建像处理程序这样的东西,这些处理程序可能与错误的线程相关联(而不是UI线程)。请记住,在你填充包含嵌入式片段的ViewStub时,所有片段的回调都将被运行,同时确保如果你在initFragment()方法中加载大量数据,则确实使用后台线程。 - user
2个回答

4
碎片必须在UI线程上加载,因为UI正在忙于加载碎片,所以进度条不会“旋转”。 您需要将碎片中的数据加载与UI内容分离。我会测试和检查是什么使碎片无法快速启动,我会使用一个加载器来加载数据,同时向用户呈现进度条(在碎片内)。是的,将进度条移动到碎片的布局中,并从那里控制一切,因为活动不需要知道碎片何时完成加载,活动不应关心这个问题。

2

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

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

正如@Luksprog所说,将视图实例化在后台线程上是不好的做法。因此,最好的解决方案可能是将.inflate()调用移到外部(主线程上),然后从后台线程调用initFragment()并将所有繁重的工作放在那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接