Android - 在谷歌地图上绘制很多行 - 让应用程序无响应

时间:2014-01-25 22:34:17

标签: android multithreading google-maps geolocation

我正在编写一个应用来跟踪谷歌地图v2上的动作。对于每个更改的位置,我将向我的数组添加一个新的地图点,然后在地图中添加折线。我也在sqlite数据库中保存位置。以下是相关代码:

LatLng mapPoint = new LatLng(location.getLatitude(), location.getLongitude());
            routePoints.add(mapPoint);

            Polyline route = map.addPolyline(new PolylineOptions().color(Color.BLUE).width(2));
            route.setPoints(routePoints);

大约2000点后,应用程序在我的手机上没有响应。我不认为这是因为数组变得太大,因为当我从数据库中提取所有数据时(有时超过6000行),它遵循相同的逻辑并且绘制地图就好了(使用数组)。我想知道是不是因为我在主线程上运行了一切(音乐播放,谷歌地图,位置服务,数据库插入,textview更改等)。如果这是罪魁祸首,我应该如何改变这一点以将事物放在不同的线程中?什么应该在不同的线程?最后,我如何编写将这些内容移动到不同的线程(代码示例或指向我的资源)。

TIA

1 个答案:

答案 0 :(得分:1)

理想情况下,您需要将不涉及UI的所有内容移动到其他线程中,尤其是网络和文件访问(例如数据库)代码。这可能是因为这里的千人减产造成的死亡。一些建议:

  1. 使用AsyncTask绝对将数据库/任何文件访问权移动到另一个线程,并在加载数据时通知您的用户界面刷新(通过启用StrictMode确认您已完成此操作
  2. 最小化数据库访问,因为它受闪存存储的支持,由于其他应用程序/ Android操作系统本身访问存储,相同的操作有时可能需要1毫秒,其他时间需要50毫秒。读完一行后,将其缓存。
  3. 如果您使用的是MediaPlayer,请将其移至AsyncTask或调用其异步方法(例如prepareAsync())
  4. 你也可能发出太多的绘图命令,做一些测试,看看是否是这种情况。如果是,则只有在您知道它将显示在屏幕上时才发出绘图命令。
  5. 您可能希望按照上述顺序进行更改。

    我真的不知道你想要完成什么,但这里有一个关于如何使用AsyncTask的大致概述:

     private class LocationTask extends AsyncTask<Source, Integer, List<PolylineOptions>> {
         protected Long doInBackground(Source... sources) {
             List<PolylineOptions> list=new ArrayList<PolylineOptions>();
    
             //create or retrieve Polyline objects here
    
             return list;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             //don't need this if it's reasonably fast
         }
    
         protected void onPostExecute(List<PolylineOptions> result) {
             for(PolylineOptions poly:result) {
                 map.addPolyline(poly);
             }
         }
     }
    

    要运行:new LocationTask().execute(source1, source2, source3); Source是用于为LocationTask提供执行其功能的任何数据结构