安卓 - 表格布局替代方案(性能问题)



我想问你,如果存在任何"对象","布局"或其他任何东西,是什么允许我加载相当大量的数据。

井。我的解决方案有效,但"有效"是一个相对的说法。

我正在AsyncTask加载数据 prom mysql.一切都很好,我得到了ResultSet,我在while周期中做了res.next(),我得到了一个数据数组。好吧,现在我有 2 个选择。

1(在屏幕上进行写入onPostExecute()方法循环遍历整个数组。(它是二维数组 [][],第一个索引是记录/行,第二个是表的每一列的值。列数索引和数组都声明为全局变量(这意味着

for{
   for{
      }
   }

2(使用onProgressUpdate(),其中我只能传递一个索引(int(,然后在ProgressUpdate中获取该数组的确切值。这意味着 publishProgress(i); doInBackground() /*i is declared before while(res.next) and it has i++ inside it = it is number of each/actuall row*/

然后只有一个用于循环在 onProgressUpdate(( 中

TableRow tblr = new TableRow()
for(int j = 0 j<columncount; /*we know from previous thing, how many columns we have*/ j++){
   TextView tv = new TextView();
   tv.setText(dataArray[i /*this is the row form while czcle above*/][j]
   tblr.addView(tv)
}
teableLayout.addView(tblr);

乍一看,第二种解决方案对系统性能的消耗要少一点,但是,这两种方式都很糟糕。

Android必须找到tableView,然后添加行,然后在行旁边添加TextViews。这很慢,如果您尝试加载更多表,我们是否可以说 300 行 15 列,其中大约 1/3 比一些"小"INT 值大,比如一些测试/blob。doInBackground()相对较快,如果连接良好,则可以快速下载数据。但是,循环 for 将其写下来会冻结 UI 的时间,这是不可接受的时间。

而且onProgressUpdate()也不是解决方案,因为手机可能会创建一个新的任务实例,试图在显示屏中写入某些内容,但它们无法一起访问屏幕,所以必须编写,然后是下一个,然后是下一个,然后,你有一个 1000+ 的队列等待任务来执行它的写入 - 它会完全冻结 UI,直到一切都完成。

所以。是否存在其他表,其作用类似于真实的数据表,而不是在行中创建表形式的文本视图,这实际上占用了设备的整个计算能力?(在小米红米上测试,4-core@1.5Ghz(

GridViewRecyclerView为要显示为表视图的大量数据提供更好的性能。而且您不需要将数据加载为 2D 数组,只需 1d 即可将数据与视图绑定,从而少使用一个嵌套循环。

您也可以考虑使用比AsyncTask更有效的东西,因为默认AsyncTask只使用一个Thread来做后台工作,并且在做一些繁重的工作时表现不佳。如果后台工作繁重,您可以考虑使用更多的Threads(或Executor(Handler或配置AsyncTaskasyncTask.executeOnExecutor()配置更多Threads

最新更新