【问题标题】:Android TableLayout with over 1000 rows loading very slowly超过 1000 行的 Android TableLayout 加载速度非常慢
【发布时间】:2014-07-03 04:06:20
【问题描述】:

我正在寻找一种方法来加快创建超过 1000 行的 TableLayout。有没有办法完全在单独的线程上创建 TableLayout 或加快速度?

这是我创建表格的方法:

private void setTable()
{       
    final Activity activity = this;

    final Handler handler = new Handler();

    new Thread(new Runnable()
    {
        @Override
        public void run() 
        {
            for (int x = 0; x < rooms.size(); x++)
            {
                final int inx = x;
                handler.post(new Runnable()
                {
                    @Override
                    public void run() 
                    {
                        Methods.createRow(table, rooms.get(inx), null, activity);
                        TableRow row = (TableRow)table.getChildAt(inx);
                        row.setOnClickListener(new OnClickListener()
                        {
                            @Override
                            public void onClick(View arg0) 
                            {
                                if (arg0.getTag() != null && arg0.getTag().getClass() == Integer.class)
                                    select((Integer)arg0.getTag());
                            }
                        });
                    }
                });
            }
        }

    }).start();
}

我希望使用 Handler 至少可以让新的 Activity 在表创建之前出现。在创建包含大量行的表时,应用程序似乎冻结了几秒钟。 setTable() 正在我的 Activity 的 onStart() 方法中运行。

Methods.createRow 在传入的 TableView 末尾添加一行。

编辑:

在决定尝试 ListView 之后,我用更少的代码得到了更好的结果。

private void setTable()
{
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, roomNames);
    table.setAdapter(adapter);
    table.setOnItemClickListener(new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
        {
            select(arg2);
        }
    });
}

【问题讨论】:

  • 您是否考虑过改用ListView

标签: android multithreading tablelayout


【解决方案1】:

首先要做的事情。

为什么您的应用会死机: 处理程序就像一个队列一样工作,它将您发布的每个帖子排队,然后在您的主线程中连续执行。

但主要问题是您试图一次显示的数据量,但使用适配器很容易解决,您可能可以使用一些默认组件来解决这个问题,例如ListViewGridView,您也许可以使您的自定义行围绕列工作。

【讨论】:

    【解决方案2】:

    仅从方法名称的猜测来看,这行代码在 main/UI 线程上运行可能会很慢: Methods.createRow(table, rooms.get(inx), null, activity);

    我建议将所有繁重的数据库工作和 UI 工作与 AsyncTask 分开,所以它可能看起来像这样:

    private OnClickListener rowClickListener = new OnClickListener()
    {
        @Override
        public void onClick(View arg0) 
        {
            if (arg0.getTag() != null && arg0.getTag().getClass() == Integer.class)
                select((Integer)arg0.getTag());
        }
    };
    
    private void setTable()
    {       
        final Activity activity = this;
    
        final Handler handler = new Handler();
    
        new AsyncTask<Void, Void, List<TableRow>>() {
            @Override
            protected List<TableRow> doInBackground(Void... params) {
                // Do all heavy work here
                final List<TableRow> rows = new ArrayList<TableRow>(rooms.size());
                for (int x = 0; x < rooms.size(); x++)
                {
                    Methods.createRow(table, rooms.get(x), null, activity);
                    rows.add((TableRow)table.getChildAt(x));
                }
                return rows;
            }
    
            @Override
            protected void onPreExecute() {
                // maybe show progress indication
            }
    
            @Override
            protected void onPostExecute(List<TableRow> result) {
                // Do all UI related actions here (maybe hide progress indication)
                for (final TableRow row : result) {
                    row.setOnClickListener(rowClickListener);
                }
            }
        };
    }
    

    由于我无法分辨某些方法中的内容,因此您只需确保已尝试在 Methods.createRow(...) 中尽可能优化,并将所有与 UI 相关的工作移至onPostExecute(...) 方法。

    【讨论】:

      【解决方案3】:

      您正在一次将所有操作堆叠在帖子中。因此,这与根本不使用线程作为您的主线程来完成所有工作相同。尝试更改为 postDelay,并为每个房间索引设置 1 毫秒或更长时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 2012-11-05
        • 1970-01-01
        相关资源
        最近更新 更多