在初始化ListView之前,在单独的线程中下载数据

时间:2011-10-26 17:47:19

标签: android multithreading listview

我的应用程序中存在多线程问题。我知道在Threads / AsyncTasks / etc上有很多帖子,但似乎都没有解决我的具体问题。

基本上,我在搜索Activity中获取了一个查询字符串,然后将其发送到我的结果Activity,其中该字符串用作SQL查询,结果作为JSON对象数组返回,然后我显示这些对象一个ListView(它是结果Activity的一部分)。我所有的SQL连接和检索都是在一个单独的类中完成的,我在结果Activity的开头调用它。

MySQLRetrieve data = new MySQLRetrieve();
ArrayList<Tile> tiles = data.getResults(nameValuePairs, isLocationSearch);

上面的代码是我如何获取SQL响应并转换为ArrayList,然后我使用填充我的ListView。 getResults()负责所有这些。

我已经有单独的线程工作将图像下载到ListView中,但我无法工作的是获取SQL查询并将结果运行在它自己的Thread中。我想要实现的是:

  1. 用户在搜索活动中输入搜索查询。
  2. 意图被发送到结果活动,并立即启动。
  3. 在进行SQL查询时,会显示ProgressDialog(只是动画的微调器,而不是加载栏)。
  4. ListView使用JSON数组中的对象填充,延迟加载图像。
  5. 我的步骤1,2和4运行良好,但问题是3。我已经查找了AsyncTasks,这似乎是答案,但我无法让它们工作。有没有人有这个问题的解决方案?我需要这样做,所以在启动结果Activity时,UI会立即更改为结果Activity,而不必等到返回SQL响应。

    是的,我已经阅读了无痛线程帖子。

    谢谢。

1 个答案:

答案 0 :(得分:2)

我建议不要创建ArrayList<Tile>以减少内存消耗(和代码大小),而是使用Cursor直接将SQLite ListView绑定到CursorAdapter。< / p>

仅此一项可能只会提高性能,因此您无需进行任何异步加载。

如果您仍想要异步加载,请查看LoaderManager framework(自Android 3.0 / API级别11以来可用,Android support package降至1.6 / 4),这将自动执行{{{{ 1}} - 要么使用内置CursorLoader(如果碰巧有Cursor),要么使用由SO用户创建的SimpleCursorLoader(如果不这样做)