从json添加1000多个标记到谷歌地图使Android应用程序非常缓慢和震惊

时间:2015-08-06 07:40:21

标签: android json google-maps google-maps-android-api-2

在我的应用程序中使用标记加载1000+位置形式JSON到谷歌地图但是当我运行我的应用程序时它完美地显示所有标记但当我试图缩放或拖动地图时它得到两个慢并且得到任何解决方案解决这个?      webservice响应如下所示

    {
               "DateTime": "8/4/2015 7:27:32 PM",
               "IME": "865733024065062",
               "IsActivated": null,
               "Latitude": "13.0115833333333",
               "Longitude": "80.2151833333333",
               "RegistrationNo": "AMvTS_01"
           },
           {
               "DateTime": "8/5/2015 12:28:17 PM",
               "IME": "887766554433711",
               "IsActivated": null,
               "Latitude": "16.060578",
               "Longitude": "73.489748",
               "RegistrationNo": "TN_TEST_803"
           },
           {
               "DateTime": "8/5/2015 12:28:17 PM",
               "IME": "887766554433567",
               "IsActivated": null,
               "Latitude": "9.722656",
               "Longitude": "76.287158",
               "RegistrationNo": "TN_TEST_659"
           },
           {
               "DateTime": "8/5/2015 12:28:17 PM",
               "IME": "887766554433740",
               "IsActivated": null,
               "Latitude": "14.895189",
               "Longitude": "74.103996",
               "RegistrationNo": "TN_TEST_832"
           },
           {
               "DateTime": "8/5/2015 12:28:17 PM",
               "IME": "887766554433017",
               "IsActivated": null,
               "Latitude": "12.688946",
               "Longitude": "80.217097",
               "RegistrationNo": "TN_TEST_048"
           },
           {
               "DateTime": "8/5/2015 12:28:17 PM",
               "IME": "887766554433769",
               "IsActivated": null,
               "Latitude": "8.887102",
               "Longitude": "76.591018",
               "RegistrationNo": "TN_TEST_861"
           }

and this is my mapfragment code given below


import java.io.IOException;
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Calendar;
import java.util.HashMap; 
import java.util.List; 
import java.util.Timer;
import java.util.TimerTask;

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.MapView; 
import com.google.android.gms.maps.MapsInitializer; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.Circle; 
import com.google.android.gms.maps.model.CircleOptions; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.PolylineOptions; 

import android.app.ActionBar; 
import android.app.AlarmManager;
import android.app.Fragment; 
import android.app.PendingIntent;
import android.app.ProgressDialog; 
import android.content.Context;
import android.content.Intent; 
import android.graphics.Color; 
import android.location.Location; 
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler;
import android.os.StrictMode; 
import android.os.SystemClock;
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast;

public class MapFragment extends Fragment implements LocationListener, OnMapClickListener, OnMapLongClickListener, OnMarkerDragListener{ 
    private static final String LOG_TAG = "ExampleApp"; 

    private MapView mMapView; 
    private GoogleMap mMap; 
    private Bundle mBundle; 
    private static final String SERVICE_URL = "http://203.109.107.139/primevts/vtsservice.svc/data"; 
    JSONObject json = null; 
    JSONArray jsonarray = null; 
    ProgressDialog mProgressDialog; 
    ArrayList<HashMap<String, String>> arraylist1; 
    private Timer timer;
    static String LONG = "Long"; 
    static String LAT = "Lat"; 
    ArrayList<String> ct; 
    public double latt = 0; 
    public double lng = 0; 
    public ArrayList<Integer> dLat; 
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;
    private Handler handler;
    private Marker marker;
    private HashMap<String, Marker> mMarkers = new HashMap<>();
int value=1;
    // LatLngBounds values ; 
    double latitude, longitude; 
    String ime,reg; 
    boolean markerClicked;

    // LatLng val; 

    static HashMap<String, String> datas; 

    static HashMap<String, String> map; 
    String[] latlngvalues;
  //  LocationManager locman;
    Context context;
     View rootView;

    public MapFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) { 
        rootView = inflater.inflate(R.layout.fragment_layout_one, container, false); 


        MapsInitializer.initialize(getActivity()); 

        mMapView = (MapView)rootView.findViewById(R.id.mapView); 
        mMapView.onCreate(mBundle); 

        MapsInitializer.initialize(getActivity()); 

        if (android.os.Build.VERSION.SDK_INT > 9) { 
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
            .permitAll().build(); 
            StrictMode.setThreadPolicy(policy); 
        } 

        new DownloadJSON().execute(); 
        setUpMapIfNeeded(rootView);

        /* handler = new Handler();
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                 new DownloadJSON().execute(); 
                    setUpMapIfNeeded(rootView); 

                 Toast.makeText(getActivity(), "Data Updated!!!! ", Toast.LENGTH_SHORT).show();
                 Log.e("Data in Log", "");
            }
        }, 1000);
        */
         final Handler handler = new Handler();
            timer = new Timer();
            TimerTask doAsynchronousTask = new TimerTask() {
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {
                            //mMap.clear();
                        // Toast.makeText(getActivity(), "Data Updated!!!! ", Toast.LENGTH_SHORT).show();
                         new DownloadJSON().execute(); 
                            setUpMapIfNeeded(rootView); 

                        }
                    });
                }
            };
            timer.schedule(doAsynchronousTask, 20000, 20000);




        /*LocationManager locman = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
        //locman.requestLocationUpdates(minTime, minDistance, criteria, intent);
        locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this);*/



        return rootView; 
    } 

    private void setUpMapIfNeeded(View inflatedView) { 

        if (mMap == null) { 
            mMap = ((MapView) inflatedView.findViewById(R.id.mapView)).getMap(); 
            mMap.setMyLocationEnabled(true); 
              mMap.addMarker(new MarkerOptions()
              .position(new LatLng(0, 0))
              .title("Marker")
              .draggable(true)
              .snippet("Hello")
              .icon(BitmapDescriptorFactory
                      .defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
            mMap.setOnMarkerDragListener(this);
            markerClicked = false;


            Location myLocation = mMap.getMyLocation(); 
            if (mMap != null) {  
                //mMap.clear();

                // setUpMap(); 
                mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 

                    @Override 
                    public void onMyLocationChange(Location arg0) { 

                        // TODO Auto-generated method stub 

                        final LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
                //  mMap.clear();
                        if(marker!=null){
                            marker.remove();
                        }
                        for (int i = 0; i < arraylist1.size(); i++) { 
                            final LatLng position = new LatLng(Double 
                                    .parseDouble(arraylist1.get(i).get("Latitude")), 
                                    Double.parseDouble(arraylist1.get(i).get( 
                                            "Longitude"))); 
                            String ime1 = arraylist1.get(i).get("RegistrationNo");
                            final MarkerOptions options = new MarkerOptions() 
                            .position(position); 
                            //mMap.addMarker(options); 
                            mMap.addMarker(options.icon(BitmapDescriptorFactory .fromResource(R.drawable.buspng)).anchor(0.0f, 1.0f).title(ime1));
                             // marker=mMap.addMarker(new MarkerOptions().position(position).icon(BitmapDescriptorFactory .fromResource(R.drawable.buspng)).title(ime1));


                            //options.title(ime1);
                            builder.include(position); 

                        } if(value==1){
                        LatLng latLng = new LatLng(arg0.getLatitude(), arg0 
                                .getLongitude()); 
                        //mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                        mMap.setMyLocationEnabled(true); 

                        //mMap.moveCamera(CameraUpdateFactory.newLatLng(newLatLnglatLng)); 
                        // mMap.setOnMapClickListener(null); 
                        mMap.setOnMarkerClickListener(null); 
                        //mMap.animateCamera(CameraUpdateFactory.zoomTo(9)); 
                        CameraPosition cameraPosition = new CameraPosition.Builder()
                        .target(latLng)      // Sets the center of the map to Mountain View
                        .zoom(10)                   // Sets the zoom
                        .build();                   // Creates a CameraPosition from the builder
                        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                        value++;
                        }
                    } 
                }); 

            } 
        } 
    } 

    /*  protected void retrieveAndAddCities() throws IOException { 
        HttpURLConnection conn = null; 
        final StringBuilder json = new StringBuilder(); 
        try { 

            URL url = new URL(SERVICE_URL); 
            conn = (HttpURLConnection) url.openConnection(); 
            InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

            int read; 
            char[] buff = new char[1024]; 
            while ((read = in.read(buff)) != -1) { 
                json.append(buff, 0, read); 
            } 
        } catch (IOException e) { 
            Log.e(LOG_TAG, "Error connecting to service", e); 
            throw new IOException("Error connecting to service", e); 
        } finally { 
            if (conn != null) { 
                conn.disconnect(); 
            } 
        } 
        new DownloadJSON().execute(); 

    } */

    private class DownloadJSON extends AsyncTask<Void, Void, Void> { 
        String result=""; 
        @Override 
        protected void onPreExecute() { 
            super.onPreExecute(); 
        }

        @Override 
        protected Void doInBackground(Void... params) { 
            try { 
                arraylist1 = new ArrayList<HashMap<String, String>>(); 

                JSONParser jParser = new JSONParser(); 
                String result = ""; 

                json = jParser.getJSONFromUrl(SERVICE_URL); 

                try { 
                    arraylist1.clear(); 

                    jsonarray = json.getJSONArray("SingleIMEs"); 
                    Log.d("Haaaaaaaaaaaa", "" + json); 

                    for (int i = 0; i < jsonarray.length(); i++) { 
                        Log.d("H11111111111111111111111111", 
                                "" + jsonarray.length()); 
                        map = new HashMap<String, String>(); 
                        json = jsonarray.getJSONObject(i); 

                        latitude = json.getDouble("Latitude"); 
                        longitude = json.getDouble("Longitude"); 
                        ime = json.getString("IME");
                        reg=json.getString("RegistrationNo");
                        map.put("Latitude", json.getString("Latitude")); 
                        Log.e("CHECKLAT",""+json.getString("Latitude") );
                        map.put("Longitude", json.getString("Longitude")); 
                        Log.e("CHECKLONG",""+json.getString("Longitude") );
                     map.put("RegistrationNo", json.getString("RegistrationNo"));
                        map.put("IME", json.getString("IME"));
                        arraylist1.add(map); 
                    } 

                } catch (JSONException e) { 
                    Log.e("log_tag", "Error parsing data " + e.toString()); 
                    result="Error"; 
                    e.printStackTrace(); 
                } 
            }catch(Exception e){ 
                result="Error"; 
            } 

            return null; 
        } 

        protected void onPostExecute(Void args) { 

            // mProgressDialog.dismiss(); 

        } 
    } 

    @Override 
    public void onResume() { 
        super.onResume(); 
        mMapView.onResume(); 
    } 

    @Override 
    public void onPause() { 
        super.onPause(); 
        mMapView.onPause(); 
    } 
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mMapView.onLowMemory();
    }

    @Override 
    public void onDestroy() { 
        mMapView.onDestroy(); 
    super.onDestroy(); 
    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

   /* Toast.makeText(getActivity(), "onLocationUpdated!!!", Toast.LENGTH_SHORT).show();
        Log.d("onLocationUpdated!!!","");
        new DownloadJSON().execute(); 
        setUpMapIfNeeded(rootView);*/

    }


    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderDisabled(String provider) {

        // TODO Auto-generated method stub

    }

    @Override
    public void onMapClick(LatLng arg0) {
        // TODO Auto-generated method stub
        mMap.animateCamera(CameraUpdateFactory.newLatLng(arg0));

          markerClicked = false;
    }

    @Override
    public void onMarkerDrag(Marker arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onMarkerDragEnd(Marker arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onMarkerDragStart(Marker arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onMapLongClick(LatLng arg0) {
        // TODO Auto-generated method stub

    } 


}

1 个答案:

答案 0 :(得分:0)

首先,当你得到它时,你可以在MarkerOptions列表中保存你的JSON信息

final List<MarkerOptions> markerOptionsList = new ArrayList<>(arraylist1.size());
for (int i = 0; i < arraylist1.size(); i++) {
    final LatLng position = new LatLng(
            Double.parseDouble(arraylist1.get(i).get("Latitude")),
            Double.parseDouble(arraylist1.get(i).get("Longitude")));
    String ime1 = arraylist1.get(i).get("RegistrationNo");
    final MarkerOptions options = new MarkerOptions()
            .position(position)
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.buspng))
            .anchor(0.0f, 1.0f)
            .title(ime1);
    markerOptionsList.add(options);
}

然后,而不是OnMyLocationChangeListener使用OnCameraChangeListener

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        mMap.clear();
        LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
        for (MarkerOptions markerOptions : markerOptionsList) {
            if (bounds.contains(markerOptions.getPosition())) {
                mMap.addMarker(markerOptions);
            }
        }
    }
});

您将清除地图并仅添加可见标记