添加嵌套视图动态冻结应用程序

Posted

技术标签:

【中文标题】添加嵌套视图动态冻结应用程序【英文标题】:Adding nested views dynamically freezes the App 【发布时间】:2015-01-09 09:30:24 【问题描述】:

我正在构建应用程序,它会动态生成和添加视图。我事先不知道我需要创建哪些视图,这些可以是嵌套布局或简单标签等,具体取决于从 Web 服务返回的内容。

到目前为止一切都很好,直到我开始构建非常复杂的嵌套布局。我有一个案例需要动态添加大约 11 级布局。当活动开始时,我显示 ProgressDialog(ring),同时正在生成视图。我的问题是,在添加视图时,这种复杂的结构 ProgressDialog 会冻结。这是创建视图的代码:

private class ViewCreator implements Runnable 

    public BackgroundTaskViewCreatedResponse delegate;
    private View mCreatedView;
    private ComponentDefinition mComponent;

    private ViewCreator(ComponentDefinition component)
        this.mComponent = component;
           

    @Override
    public void run() 
        try 
            if (mComponent != null)
                mComponent.setLinkedData(model.getLinkedData());
                mCreatedView = componentCreator.createComponent(mComponent);
            
         finally 
            if (mCreatedView != null)
                delegate.processFinishTask(mCreatedView);
        
    

布局,里面有其他视图,实现BackgroundTaskViewCreatedResponse,所以,当视图准备好时,它会被添加:

@Override
public void processFinishTask(final View createdView) 
    //((Activity)view.getContext()).runOnUiThread(new Runnable()
    mView.post(new Runnable()
        @Override
        public void run() 
            mView.addView(createdView);
        
    );

正如您在上面看到的,我尝试调用 runOnUiThread 调用,但这会在生成视图层次结构时完全阻塞 UI 线程。同时view.post 并没有被直接调用,所以我按照this SO answer 中的建议对视图进行了一些更改。所以,现在我的视图被添加了,但是我的 ProgressDialog 运行不顺畅。它会在几次停止然后恢复。我也尝试过使用 android AsyncTask,但效果与 runOnUiThread 相同

我对线程不是很有经验,几天来一直在尝试解决这个问题。请帮忙。

【问题讨论】:

I am not very experienced with Threads @Selvin:谢谢,我已经尝试过使用 StrictMode 并且似乎没有任何违反政策的行为。目前正在尝试使用这个:developer.android.com/tools/debugging/debugging-tracing.html。您还有什么可以建议的吗? 【参考方案1】:

您可以使用 AsyncTask 来执行此操作/这是一个示例:

private class GenerateViews extends AsyncTask<Void,Void,Void>

    @Override
    protected void onPreExecute() 
        // SHOW THE SPINNER WHILE GENERATING VIEWS
        spinner.setVisibility(View.VISIBLE);

    

    @Override
    protected Void doInBackground(Void... params) 

         //CALL YOUR VIEW GENERATING METHOD HERE

         return null;
        

    @Override
    protected void onPostExecute(Void result)

        spinner.setVisibility(View.INVISIBLE);

    

如果你愿意,你可以在你的班级里创建这个班级。然后,你只需调用

new GenerateCalls.execute();

【讨论】:

我已经试过了,谢谢。它阻塞线程比我现在拥有的更糟糕。 这很奇怪..好吧,如果您找到了解决问题的方法,请在此处发布您的答案。我想知道:)

以上是关于添加嵌套视图动态冻结应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android:在嵌套布局中动态添加视图

在滚动视图中动态隐藏状态栏时滞后/屏幕冻结(Swift 3)

Ember JS 过渡到嵌套路由,其中​​所有路由都是视图中的动态段

应用“scrollTo”以显示动态添加的嵌套面板的正确事件

使用 xamarin.ios c# 以编程方式添加嵌套的堆栈视图

将视图控制器添加到我的视图并编程冻结。目标-c