我有一个方法,它将数据放在一个非常大的数组中,并在人机界面上显示一个非常大的表。桌子很大,屏幕空白了一段时间。我可以将显示方法放在Asynctask中并显示进度条,直到显示方法完成吗?
答案 0 :(得分:0)
不,您无法从后台访问视图。您可以在后台线程中将数据加载到数组中(因此它在加载期间不会阻止UI),然后在适配器中将此数组用于ListView。如果您发布代码,我可以回答您更多详细信息
答案 1 :(得分:0)
如Chaosit所述,您无法从后台线程访问UI。
考虑在异步任务中加载数据,将表加载到UI尝试逐行呈现。如果您使用的是listView,则可以添加/编辑单元格而不渲染整个表格。
当处理大量需要在用户移动Map时呈现的PIN时,我使用了相同的技术.i加载其中一些并将它们逐个渲染到UI。
答案 2 :(得分:0)
加载大量数据的最佳方法是在ProgressBar
中显示onPreExecute()
,在doInBackground(...)
中加载数据,并将进度条的可见性设置为{{1在GONE
。
另一种不错的方法是在onPostExecute(Boolean success)
中显示Dialog
来电.show()
并在onPreExecute()
中将其解除,可能会更新onPostExecute(Boolean success)
中的对话消息}。
请记住,您无法在onProgressUpdate(String... message)
中更新或更改自己的用户界面,但可以在doInBackground(...)
,onPreExecute()
和onPostExecute(Boolean success)
中进行更新。
答案 3 :(得分:0)
如果数据来自数据库(或来自远程源),则考虑使用Loaders / CursorAdapter来构建ListView。这是一种非常有效的数据加载方式。
如果您正在从文件中读取数据数据然后尝试分解数据 - 只需选择您在屏幕上显示的数据,而不是从文件中读取所有数据,并尝试渲染项目将不会显示 - 然后您可以使用AsyncTask或线程(和处理程序)来更新您的表。
正如其他人所提到的,只有主线程可以更新UI。
答案 4 :(得分:0)
当然不是所有数据都会立刻显示出来! 请查看Loaders指南。它允许您加载大型数据集,并仅显示其中的一部分,从而减少加载时间。
答案 5 :(得分:0)
使用asynctask as
可以实现所述功能class TestAsync extends AsyncTask<Void, Integer, String>
{
protected void onPreExecute ()
{
//Start showing progress bar here ...
}
protected String doInBackground(Void...arg0)
{
// Do long running operation here ...
return "You are at PostExecute";
}
protected void onPostExecute(String result)
{
// Start displaying data in your table view and dismiss the progress bar
}
}
在您的活动中将其称为:
new TestAsync().execute();