有关如何加快Android速度的建议?

时间:2010-02-17 12:53:12

标签: java android multithreading optimization listview

在一项活动中,我这样做:

  • 每分钟,我都会将GPS位置更新为云端。
  • 然后,在更新位置后,我下载了10个人及其图标的列表......并在列表中更新它们。 (每个图标为80x80和约2Kb)

每分钟都会这样做,一遍又一遍。

我的问题是:它似乎有点慢?有时当我向下滑动列表时,它很慢?当我点击时,响应不会立即......并且可能需要稍微保留。

你认为我可以用多个“线程”或其他东西解决这个问题吗?请指教。感谢。

编辑:当它将名称和用户图标加载到列表中时...它实际上无法使用。该列表会冻结......而且您无法向上或向下滑动。当它没有加载时......列表会非常缓慢地滑动。

3 个答案:

答案 0 :(得分:5)

对于像在“活动”中“下载”内容的操作,使用后台服务为Activity做工作总是有用的,然后保持响应!如果你试图在Activity本身中做这样的事情,你肯定会遇到响应问题,我可以向你保证! 所以:我的回答是 - 是的。为此实现后台服务!

答案 1 :(得分:2)

线程和缓存可能是好主意。如果您的列表只有10个人(10倍2kB内存,20kB),那么请考虑使用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的缓存列表,直到后台任务完成并刷新。你可以做更高级的事情来节省更多的内存,比如重用刷新列表等,但我希望上面提供了一些关于如何在后台执行此操作的信息。还要记住在列表中重复使用convertview,以避免在列表中滚动时对每个项目进行大量垃圾回收。

答案 2 :(得分:1)

除非您设法在一个请求中下载所有信息,否则您将通过线程化来获得时间。此外,是否真的有必要一遍又一遍地下载图标?也许你可以缓存它们?