Android - 表格布局替代(性能问题)

时间:2015-12-17 01:48:40

标签: android android-layout

我想问你,如果存在任何“对象”,“布局”或其他什么,那么我可以加载大量数据。

好。我的解决方案有效,但“工作”是一个非常相对的陈述。

我正在AsyncTask加载数据prom mysql。一切正常,我得到ResultSet,我在res.next()周期中执行while,我得到一组数据。好吧,现在我有两个选择。

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

for{
   for{
      }
   }

2)使用onProgressUpdate(),我只能传递一个索引(int),然后在onProgressUpdate中获取该数组的确切值。 这意味着 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()相对较快,如果连接良好,则可以快速下载数据。但是,将其写下来的循环会将UI冻结在一段不可接受的时间内。

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

因此。 是否存在一些其他表,它像真正的数据表一样,而不是在行中创建表格形式的文本视图,这需要整个设备的整体计算能力? (在xiaomi hongmi上测试,4-core @ 1.5Ghz)

1 个答案:

答案 0 :(得分:0)

GridViewRecyclerView可以提供更好的效果,可以将大量数据显示为表格视图。您不需要将数据作为二维数组加载,但只需1d即可用视图绑定数据,因此使用一个较少的嵌套循环。

此外,您可以考虑使用比AsyncTask更高效的内容,因为默认AsyncTask仅使用一个Thread来执行后台工作,并且在执行繁重的工作时效果不佳。您可以考虑将更多Threads(或Executor)与Handler一起使用,或将AsyncTaskThreads配置为asyncTask.executeOnExecutor(),如果背景为{}工作很重。