使用AsyncTask显示大表

时间:2015-04-28 14:02:33

标签: android

我有一个方法,它将数据放在一个非常大的数组中,并在人机界面上显示一个非常大的表。桌子很大,屏幕空白了一段时间。我可以将显示方法放在Asynctask中并显示进度条,直到显示方法完成吗?

6 个答案:

答案 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();