0

Ich habe mehrere Markierungen auf Karte in meiner postexecute-Methode aktualisiert, weil ich Lat-Lon von Json brauche, In diesem Fall wird meine Anwendung erhalten hängen für 4-5 Sekunden und irgendwann zeigt NachrichtHinzufügen von mehreren Markern nach Erhalt der Antwort von JSON, aber Anwendung möglicherweise zu viel Arbeit auf seinem Hauptthread

Anwendung reagiert nicht

, hier ist mein Code-

try{ 
     JSONArray jsonArray = jsonObject.getJSONArray("data"); 
     for (int i = 0; i < jsonArray.length(); i++) { 

      jsonObject2=jsonArray.getJSONObject(i); 
      ViewAgency_Set_Get set_Get = new ViewAgency_Set_Get(); 
      set_Get.setservices_type(jsonObject2.getString("fld_category_name")); 
      set_Get.setCity(jsonObject2.getString("fld_city_name")); 
      set_Get.setPincode(jsonObject2.getString("fld_pincode")); 
      set_Get.setSalary(jsonObject2.getString("fld_budget")); 
      set_Get.setFulltime_preference(jsonObject2.getString("fld_full_time_preference")); 
      set_Get.setParttimePreference(jsonObject2.getString("fld_part_time_preference")); 
      set_Get.setAvailabiliy(jsonObject2.getString("fld_availability")); 
      set_Get.setExperience(jsonObject2.getString("fld_exp_from")+"-"+jsonObject2.getString("fld_exp_to")); 
      set_Get.setDate(jsonObject2.getString("fld_posting_date")); 
      set_Get.setVendor_worker_id(jsonObject2.getString("fld_post_your_req_id")); 
      set_Get.setApply_job("Apply"); 
      JSONArray jsonArray2 = jsonObject2.getJSONArray("getjobSpecItems"); 
      for (int j = 0; j < jsonArray2.length(); j++) { 
       JSONObject jsonObject3 = jsonArray2.getJSONObject(j); 
       Grid_specs grid_specs = set_Get.new Grid_specs(); 
       grid_specs.setSpeciality(jsonObject3.getString("fld_sub_category_name")); 
       set_Get.list_Specs.add(grid_specs); 
      } 
      arrayList_jobs.add(set_Get); 

      final Geocoder geocoder = new Geocoder(getActivity()); 
      final String zip = jsonObject2.getString("fld_pincode"); 
      List<Address> addresses = geocoder.getFromLocationName(zip, 1); 
      if (addresses != null && !addresses.isEmpty()) { 
       address = addresses.get(0); 
       String message = String.format("Latitude: %f, Longitude: %f", 
         address.getLatitude(), address.getLongitude()); 

       markerOptions = new MarkerOptions().position(
         new LatLng(address.getLatitude(), address.getLongitude())) 
         .title("Job Posted for:- "+jsonObject2.getString("fld_category_name")); 

       // changing marker color 
       if (arrayList_jobs.get(i).getservices_type().equals("Tutor")){ 
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_tutor)); 
       } 
       if (arrayList_jobs.get(i).getservices_type().equals("Maid")){ 
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_maid)); 
       }if (arrayList_jobs.get(i).getservices_type().equals("Driver")){ 
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_driver)); 
       }if (arrayList_jobs.get(i).getservices_type().contains("Chef")){ 
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_chef)); 
       }if (arrayList_jobs.get(i).getservices_type().equals("Helper")){ 
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_help)); 
       } 
       marker =googleMap.addMarker(markerOptions); 
      } 
     } 

     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(latitude, longitude)).zoom(13).build(); 
     googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
     SearchJobListAdapter adapter = new SearchJobListAdapter(getActivity(), arrayList_jobs, 
       "Show",manager); 
     search_listView.setAdapter(adapter); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

Antwort

0

gibt 2 Haupt dass I verbessert werden kann unter:

1) markerOptions.icon (BitmapDescriptorFactory.fromResource (R.drawable.marker_XXX);

dieses braucht viel Zeit und Sie tun es oft

Lösung ist es, alle Bitmap für Markierungen zu erzeugen, wenn u die Aktivität zum Beispiel initialisieren. Wenn sie zu viele sind und Sie wissen, dass Sie sie nicht alle verwenden werden, können Sie sie zumindest zwischenspeichern. Dies beschleunigt die Zuteilung

2) ist die Tatsache, dass Sie viel tun, eine Einstellung Daten im Wesentlichen bewegen es von 1 Ort zum anderen. Sie könnten dies bereits vorher in der parseNetworkResponse-Methode Ihrer Anfrage tun. Sie können den Marker dort erstellen und in ein Array einfügen und dann im Hauptthread einfach iterieren, um sie zur Map hinzuzufügen.

@Override 
protected Response<T> parseNetworkResponse(
     NetworkResponse response) { 
    try { 
     String json = new String(response.data, 
     HttpHeaderParser.parseCharset(response.headers)); 
    return Response.success(gson.fromJson(json, clazz), 
    HttpHeaderParser.parseCacheHeaders(response)); 
    } 
    // handle errors 
... 
} 

weitere Informationen von der Quelle here

schließlich auch Sie solche mit 2 Dinge, die Sie noch einige Probleme haben, wenn Sie Ihre Karte mit vielen Markierungen aktualisieren. Die Lösung für dieses Problem besteht einfach darin, keine neuen Markierungen hinzuzufügen, wenn Sie bereits einige Markierungen haben, so dass Sie Markierungen beibehalten müssen und diese dann einfach ausblenden und anzeigen müssen, je nachdem, was die Antwort ist. Beachten Sie, dass das Verweilen von vielen versteckten Markierungen auch die Karte verlangsamen wird, so dass Sie sie irgendwann reinigen müssen.

+0

danke für ihren wertvollen kommentar, ich habe ihre beiden lösungen ausprobiert anstatt die app an irgendeinem punkt aufgehängt zu bekommen, kann ich meine marker aktualisieren, indem ich eine art progress bar vor dem bildschirm zeige. – Decveen

+0

natürlich können Sie und Sie sollten. Es gibt Tausende von Lösungen und verschiedene Arten von Fortschrittsbalken/Indikatoren, so dass Sie einen auswählen müssen. im Grunde müssen Sie es zu Ihrem Layout hinzufügen, dann, wenn Sie eine Anfrage machen, starten Sie es und onResponse, wenn die Marker erstellt werden und fertig Sie aufhören :) – djodjo