我想问你,如果存在任何“对象”,“布局”或其他什么,那么我可以加载大量数据。
好。我的解决方案有效,但“工作”是一个非常相对的陈述。
我正在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)
答案 0 :(得分:0)
GridView
或RecyclerView
可以提供更好的效果,可以将大量数据显示为表格视图。您不需要将数据作为二维数组加载,但只需1d即可用视图绑定数据,因此使用一个较少的嵌套循环。
此外,您可以考虑使用比AsyncTask
更高效的内容,因为默认AsyncTask
仅使用一个Thread
来执行后台工作,并且在执行繁重的工作时效果不佳。您可以考虑将更多Threads
(或Executor
)与Handler
一起使用,或将AsyncTask
与Threads
配置为asyncTask.executeOnExecutor()
,如果背景为{}工作很重。