2011-10-26 24 views
0

我的应用程序中出现多线程问题。我知道Threads/AsyncTasks/etc中有很多帖子,但似乎没有解决我的具体问题。在初始化ListView之前在单独的线程中下载数据

基本上,我在我的搜索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查询和结果运行在它自己的线程。我想要达到的是:

  1. 用户在搜索活动中输入搜索查询。
  2. 意图被发送到结果活动,并立即开始。
  3. ProgressDialog(只是动画的微调器的东西,而不是加载栏)在SQL查询发生时显示。
  4. ListView用来自JSON数组的对象填充,延迟加载图像。

我有步骤1,2和4运行良好,但3是问题。我查了一下AsyncTasks,这似乎是答案,但我无法让他们工作。有没有人有解决这个问题?我需要这样做,因此在开始结果Activity时,UI会立即更改为结果Activity,并且不必等到返回SQL响应为止。

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

谢谢。

+0

你是什么意思“......似乎没有工作”? – DeeV

+0

我的ListView不会随下载结果更新。 – jmhend

回答

2

我建议针对创建ArrayList<Tile>以减少内存消耗(和代码大小)和而不是直接使用一个CursorAdapter SQLite的Cursor绑定到ListView

仅此一项可能会提高性能,足以让您无需执行任何异步加载。

如果你仍然想异步加载,检查出LoaderManager framework(可由于Android 3.0/API级别11,与Android support package下降到1.6/4),将自动地做你的Cursor的异步加载 - 或者使用内置的CursorLoader(如果您碰巧拥有ContentProvider),或者SO专家用户创建的SimpleCursorLoader(如果您没有)。

+0

对不起,我没有说清楚。我没有使用SQLite,我正在使用一个PHP脚本的MySQL服务器。 – jmhend

+0

没问题,那么无论如何我会推荐一个本地数据库用于性能/缓存的原因。使用'AsyncTask'从PHP脚本下载JSON格式的数据,并将其放入应用程序的SQLite数据库中。然后使用上面提到的'CursorAdapter'或'LoaderManager'方法从SQLite数据库到'ListView'。这也将您的应用从服务器端分离出来,并允许您更新任一端而不会在另一端破坏事物。 –

相关问题