8

asynctaskこれが、XMLから解析された場所にピンを配置する私の部分です。これは、小さなロケーションデータセットでは問題なく機能しますが、ロケーションデータセットが大きい場合は時間がかかります。

private class MapLoader extends AsyncTask<Void, Void, Void> {
    ProgressDialog dialog;
    ArrayList<POI>[] mappoiList;

    @Override
    protected void onPreExecute() {
        mapOverlays = mapview.getOverlays();
        dialog = new ProgressDialog(MainActivity.this);
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {

        try {

            URL url = new URL(MainActivity.baseUrl
                    + "latitude=40.9192799&longitude=-74.0657508&distance=20");
            
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            ParserHandler parserHandler = new ParserHandler();
            xr.setContentHandler(parserHandler);
            xr.parse(new InputSource(url.openStream()));
            Log.d("Thread", url.toString());
            basicItems = parserHandler.getBasicItems();
            featuredItems = parserHandler.getFeaturedItems();
            restaurants = parserHandler.getRestaurants();
            mapvisibleList = new ArrayList<POI>();
            mappoiList = new ArrayList[2];
            mappoiList[0] = new ArrayList<POI>();
            mappoiList[1] = new ArrayList<POI>();

            for (int i = 0; i < featuredItems.size(); i++) {

                POI poi = new POI(featuredItems.get(i), 1);
                mappoiList[0].add(poi);
            }
            for (int i = 0; i < restaurants.size(); i++) {

                POI poi = new POI(restaurants.get(i), 2);
                mappoiList[0].add(poi);
            }
            for (int i = 0; i < basicItems.size(); i++) {

                POI poi = new POI(basicItems.get(i), 0);
                mappoiList[1].add(poi);
            }

            for (int i = 0; i < mappoiList[0].size(); i++) {
                if (mappoiList[0] != null) {
                    mapvisibleList.add(mappoiList[0].get(i));
                }
            }

            for (int i = 0; i < mappoiList[1].size(); i++) {
                if (mappoiList[1] != null) {
                    mapvisibleList.add(mappoiList[1].get(i));
                }
            }
            for (FeaturedItem item : featuredItems) {
                Log.d("FEATURED",
                        item.getName() + "Distance: " + item.getDistance());
            }
            for (Restaurant item : restaurants) {
                Log.d("RESTAURANTS",
                        item.getName() + "Distance: " + item.getDistance());
            }
            for (BasicItem item : basicItems) {
                Log.d("BASIC",
                        item.getName() + "Distance: " + item.getDistance());
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
            showErrorDialog("Error", "Malformed URL Error Occurred");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
            showErrorDialog("Error",
                    "Parser Configuration Problem Occurred");
        } catch (SAXException e) {
            e.printStackTrace();
            showErrorDialog("Error", "SAX Parser Error Occurred");
        } catch (IOException e) {
            e.printStackTrace();
            showErrorDialog("Error", "IOException Occurred");
        } catch (Exception e) {
            e.printStackTrace();
        }

        GlobalData.gBasicItems = basicItems;
        GlobalData.gFeaturedItems = featuredItems;
        GlobalData.gRestaurants = restaurants;

        if (currentLocation != null) {
            int curLat = (int) (currentLocation.getLatitude() * 1e6);
            int curLon = (int) (currentLocation.getLongitude() * 1e6);
            GeoPoint gp = new GeoPoint(curLat, curLon);
            mapControl.animateTo(gp);

            mapControl.setZoom(14);
            OverlayItem item = new OverlayItem(gp, "My Location",
                    "My Location");

            itemizedOverlay1 = new MyItemizedOverlay(drawableFeature,
                    MainActivity.this, mappoiList[0]);
            itemizedOverlay2 = new MyItemizedOverlay(drawableBasic,
                    MainActivity.this, mappoiList[1]);
            itemizedOverlay3 = new MyItemizedOverlay(drawableCurrent,
                    MainActivity.this, mappoiList[0]);
            Log.i("asyncbasic", "" + basicItems.size());
            Log.i("asyncfeatured", "" + featuredItems.size());
            Log.i("asyncres", "" + restaurants.size());
            if (featuredItems != null) {
                int featuredLength = featuredItems.size();
                for (int i = 0; i < featuredLength; i++) {
                    FeaturedItem fItem = featuredItems.get(i);
                    int lat = (int) (Double
                            .parseDouble(fItem.getLatitude()) * 1e6);
                    int lon = (int) (Double.parseDouble(fItem
                            .getLongitude()) * 1e6);
                    OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
                            lon), fItem.getName(), "Feature");
                    itemizedOverlay1.addOverlay(oItem);
                    Log.i("Map over lay", "Finished one featured");
                }
            }
            if (basicItems != null) {
                int basicLength = basicItems.size();
                for (int i = 0; i < basicLength; i++) {
                    BasicItem bItem = basicItems.get(i);
                    int lat = (int) (Double
                            .parseDouble(bItem.getLatitude()) * 1e6);
                    int lon = (int) (Double.parseDouble(bItem
                            .getLongitude()) * 1e6);
                    OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
                            lon), bItem.getName(), "Basic");
                    itemizedOverlay2.addOverlay(oItem);
                    Log.i("Map over lay", "Finished one Basic");

                }
            }
            if (restaurants != null) {
                int resLength = restaurants.size();
                for (int i = 0; i < resLength; i++) {
                    Restaurant res = restaurants.get(i);
                    int lat = (int) (Double.parseDouble(res.getLatitude()) * 1e6);
                    int lon = (int) (Double.parseDouble(res.getLongitude()) * 1e6);
                    OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
                            lon), res.getName(), "Restaurant");
                    itemizedOverlay1.addOverlay(oItem);
                    Log.i("Map over lay", "Finished one Restaurant");
                }
            }

            itemizedOverlay3.addOverlay(item);
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mapOverlays.clear();
        mapOverlays.add(itemizedOverlay1);
        mapOverlays.add(itemizedOverlay2);
        mapOverlays.add(itemizedOverlay3);
        mapview.postInvalidate();
        dialog.dismiss();

    }
}

getLatitudeSpan私はこの問題の使用と解決方法について学びましgetLongitudeSpanたが、非同期タスクのどこでどのように使用するかについてはあまり明確ではありません。助言がありますか?

4

4 に答える 4

0

コンシューマーがマップ自体であり、プロデューサーがピンの情報を生成するロジックであるプロデューサー-コンシューマーモデルの実装を検討することをお勧めします。

于 2013-02-21T11:42:47.713 に答える
0

問題はオーバーレイではないと思います。saxパーサーを使用してすべてのアイテムを取得していますが、これには時間がかかります。すべての要素を取得してからマップに追加しようとしています。単一の要素の更新をオーバーレイして入力するようにコードを変更すると、実行が高速化される場合があります。それでも同じ問題が発生する場合は、オーバーレイの別のスレッドまたはキャンバス オブジェクトを使用して要素を追加してみてください (ジオ ポイントの投影による)。

于 2013-02-20T11:38:35.907 に答える
0

時間がかかる正確なデータ サイズを指定してください。また、コードをプロファイリングして、各コード ブロックの所要時間を確認してください。

しかし、コードを見ると、これらすべての変数をループすると、操作対象のデータが増加した場合、時間に大きな影響を与えます。

ループを単純化/結合してみてください。

たとえば、このループ

        for (int i = 0; i < featuredItems.size(); i++) {

                POI poi = new POI(featuredItems.get(i), 1);
                mappoiList[0].add(poi);
            }

そしてこれ

       if (featuredItems != null) {
                  int featuredLength = featuredItems.size();
                   for (int i = 0; i < featuredLength; i++) {
                    FeaturedItem fItem = featuredItems.get(i);
                    int lat = (int) (Double
                            .parseDouble(fItem.getLatitude()) * 1e6);
                    int lon = (int) (Double.parseDouble(fItem
                            .getLongitude()) * 1e6);
                    OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
                            lon), fItem.getName(), "Feature");
                    itemizedOverlay1.addOverlay(oItem);
                    Log.i("Map over lay", "Finished one featured");
                }
            }

併用できない?

このループも

   for (int i = 0; i < basicItems.size(); i++) {

                POI poi = new POI(basicItems.get(i), 0);
                mappoiList[1].add(poi);
                }

この

        if (basicItems != null) {
                int basicLength = basicItems.size();
                for (int i = 0; i < basicLength; i++) {
                    BasicItem bItem = basicItems.get(i);
                    int lat = (int) (Double
                            .parseDouble(bItem.getLatitude()) * 1e6);
                    int lon = (int) (Double.parseDouble(bItem
                            .getLongitude()) * 1e6);
                    OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
                            lon), bItem.getName(), "Basic");
                    itemizedOverlay2.addOverlay(oItem);
                    Log.i("Map over lay", "Finished one Basic");

                }
            }

組み合わせることもでき、

于 2013-02-19T18:46:08.537 に答える
0

かなり時間がかかるsax パーサーを使用しています。json のようなオブジェクト モデルの代表を使用します。これは簡単に解析でき、マップ上にプロットできます。

//直面している時間の問題を軽減する可能性のある提案はほとんどありません。

  1. ピンのみをプロットし、クリックするとポップアップが開き、内部の詳細が表示されます。
于 2013-04-17T07:18:51.357 に答える