4

可能这是一个非常愚蠢的问题,但我创建了这样的结构,但我确实遇到了性能问题。

public class OuterClass extends LinearLayout {

private LinearLayout viewPort;

public OuterClass(Context context) {
    super(context);     
    initComponents(context);
    addInnerClass();
}

private void initComponents(Context context){

    LayoutInflater inflater = (LayoutInflater) getContext().
        getSystemService(Context.LAYOUT_INFLATER_SERVICE);      
    inflater.inflate(R.layout.view_port, this);     
    viewPort = (LinearLayout) findViewById(R.id.view_port);     
}

private void addInnerClass(){

    for ( int i = 0; i < k; i++ ){
        InnerClass functio = this.new InnerClass();
        viewPort.addView(functio);
    }

}
    private class InnerClass extends RelativeLayout{

    private LineraLayout newLines; 

    public InnerClass() {
        super(OuterClass.this.context);     
        initComponents(OuterClass.this.context);
        addNLines();
    }

    private void initComponents(Context context){

        LayoutInflater inflater = (LayoutInflater) getContext().
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        inflater.inflate(R.layout.job_function_container, this);

        newLines = (LinearLayout) findViewById(R.id.newLines);          

    }

    private void addInnerOfInner(View view){
        newLines.addView(view);
    }

    private void addNLines(){

        for ( int i = 0; i < k1; i++ ){
            InnerOfInnerClass line = this.new InnerOfInnerClass();
            addInnerOfInner(line);
        }

    }

        public class InnerOfInnerClass extends RelativeLayout{


            private InnerOfInnerClass(){
                super(OuterClass.this.context);             
                initComponents(OuterClass.this.context);
            }

            private void initComponents(Context context){

                LayoutInflater inflater = (LayoutInflater) getContext().
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                inflater.inflate(R.layout.new_line, this);

                // Setting some fields.
            }               

        }   

    }

}

更具体地说,如果我尝试在每个 InnerClass 中创建 5 个 InnerClass 对象和 5 个 InnerOfInner Class 对象,那真的很慢。如果有人能解释一下原因,我将不胜感激。谢谢。

4

1 回答 1

1

似乎没有任何东西可以从您的代码中脱颖而出,成为一个巨大的危险信号。至于为什么它在创建部分真的很慢可能有多种原因。需要考虑的事项:

  1. OuterClass 如何从活动中实例化?它是只被调用一次还是你创建了几个实例。你拥有的越多,它就会越慢。

  2. R.layout.new_line、R.layout.job_function_container、R.layout.view_port 上有多少其他小部件?只有一个小部件与每个小部件 50 个可能会导致一些明显的延迟。

  3. 你用什么设备测试?在旧 Droid 上运行会比在 Nexus 7 上测试要慢得多。如果您使用模拟器......好吧,总是希望一切运行缓慢。

  4. 最后(可能也是最相关的),我认为最大的放缓是嵌套布局的复杂性或深度。正如 Ancantus 所提到的,尽量避免使用较深的布局层。走得太深,奇怪的事情可能会开始发生。主要是由于这种层次结构消耗的内存量。

如果您需要添加视图的动态方法,我建议您查看 ListView、GridView 甚至是 GridLayout(如果您的目标平台允许)。在我的脑海中,我想不出你为什么需要如此复杂的设计。尽管有特殊情况需要,但通常总有一种更简单、更正确的方法。

以下是一些有关布局优化的有用链接,它们可能对您有帮助,也可能对您没有帮助:

于 2012-10-22T16:43:33.420 回答