如何在Android上加速此操作?

4
在一个Activity中,我正在做以下操作:
  • 每分钟,我将GPS位置更新到云端。
  • 然后,在位置更新后,我下载10个人和他们的图标列表...并在列表中更新它们。(每个图标大小为80x80,大约2Kb)
这样的操作会一遍又一遍地重复进行。
我的问题是:这个过程似乎有点慢?有时候当我向下滑动列表时,速度很慢?当我点击时,响应不是立即的...可能需要稍微等待一下。
你认为我可以用多个“线程”或其他方法来解决这个问题吗?请给予建议。谢谢。 编辑:当加载名称和用户图标到列表中时...它几乎无法使用。列表会冻结...你无法向上或向下滑动。 当不加载时...列表滑动得非常缓慢。
3个回答

5

对于像在Activity中下载东西这样的动作,拥有后台服务始终是非常有用的,因为它可以使Activity保持响应!如果您尝试在Activity本身内完成类似的操作,那么将肯定会导致响应性能问题,我可以向您保证!所以:我的答案是-是的,请实现一个后台服务来完成此任务!


3
如果有必要的话,使用服务是可行的选择,您仍然可以向服务添加缓存。 - vickirk

2

线程和缓存可能是个好主意。如果你的列表只有十个人(10次2kB的内存,20 kB),那么考虑在UI上使用缓存列表,并在每次下载后更新它。为此,请查看在Android 1.5中引入的AsyncTask类。一个简单的代码示例可能如下所示:

mCachedList;

private void onUpdate(Location location) { 
  DownloadTask refresh = new DownloadTask(location);
  refresh.execute();
}

private class DownloadTask extends AsyncTask<Location, void, ArrayList<ListItem> {

protected ArrayList<ListItem> doInBackground(Location... params) {
  final ArrayList<ListItem> refreshlist = new ArrayList<ListItem>;
  Location location = params[0];
  sendToCloud(location);
  while(!done) {
    ListItem next = downLoadPerson();
    refreshlist.add(next);
  }
  return refreshlist;
}

protected void onPostExecute(ArrayList<ListItem> refreshlist) {
  mCachedList = refreshlist;
}
}

在后台任务完成并刷新之前,使用缓存列表来更新UI。还有更高级的方法可以节省更多内存,比如重用refreshlist等,但我希望以上内容能提供一些关于如何在后台完成此操作的信息。同时,在列表中滚动时,请记得重用convertview以避免每个项目上进行大量垃圾收集。


1

除非您能够在一个请求中下载所有信息,否则通过线程化可以节省时间。此外,是否有必要一遍又一遍地下载图标?也许您可以将它们缓存起来?


好的,你可以简单地将它们写入SD卡或其他存储设备。问题实际上取决于如何检测是否需要更新图标。 - pgsandstrom
看一下记忆化或使用记忆化的函数。这是适合您的简单缓存策略。 - boatcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接