【问题标题】:Displaying large tables without choking UI thread在不阻塞 UI 线程的情况下显示大表
【发布时间】:2011-07-06 21:25:59
【问题描述】:

我有一个大约 1k 行的表格要显示。这个任务显然阻塞了 UI 线程,导致在 onCreate() 建表时出现黑屏。

我已经通过使用 AsyncTask 解决了这个问题,它在“doInBackground”函数中构建想要的 TableLayout 并将其显示在“onPostExecute”函数中。

问题 #1: 有什么我不熟悉的更好的做法吗?

问题 #2: 我的(简化的)“doInBackground”函数如下所示:

protected Void doInBackground(Void... v) {

        tmpTableLayout = populateTable("");
        return null;
    }

我的(简化的)“onPostExecute”函数如下所示:

protected void onPostExecute(Void v) {

        TableLayout ct = (TableLayout)findViewById(R.id.RealTable);
        ct.removeAllViews();
        /* WHATS HERE? */
    }

我应该写什么而不是“这里有什么?”在最后一行代码中为了在“ct”中显示“tmpTableLayout”的内容?

提前致谢!

【问题讨论】:

  • 数据从何而来?
  • 它在应用程序初始化时来自网络并存储在全局变量中。
  • 如果您将数据放入 sqlite 数据库,那么我的答案可能是最好的方法,否则,David Olsson 的答案将是要走的路。

标签: android android-asynctask tablelayout


【解决方案1】:

您确定要一次性显示所有内容吗?

一种方法是在用户向下滚动时动态加载更多行。因此,有一个滚动侦听器来检查用户是否接近所显示内容的末尾,从而启动 AsyncTask 或加载更多内容的线程。

示例: Android List Activity with dynamically loaded images form the web in android

【讨论】:

  • 嗯...很有趣,但您不认为用户每次向下滚动时等待会更烦人吗?
  • 只要在开始之前根据需要达到的行数来计划头部。但最终用户可能仍需等待。只是为了方便起见,每次都等一会儿或再等一会儿。我宁愿第一次等待一小段时间。但这一切都取决于将显示什么样的数据,用户每次向下滚动的可能性有多大?
  • 我试过了,效果很好,谢谢!顺便说一句-滚动时我什至没有注意到最小的延迟!
【解决方案2】:

我可能会使用ListViewCursorAdapter 并让Android 为您管理获取数据。查看接受的答案here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多