2013-08-31 10 views
8

मैं Picasso libraryपिकासो

का उपयोग कर एक मार्कर एक imageView मैं एक लक्ष्य के बजाय

for(int x =0; x < mapIcon_url.length; x++){ 

    Picasso.with(getActivity()).load(mapIcon_url[x]).resize(marker_size, marker_size+15).into(new Target() { 

     @Override 
     public void onSuccess(Bitmap b) { 
      bitmapMarker = BitmapDescriptorFactory.fromBitmap(b); 


      //create marker option 
      if(b != null) 
       markerOptions = new MarkerOptions().position(marker_position).icon(bitmapMarker)); 
      else 
       markerOptions = new MarkerOptions().position(marker_position).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder_pin)).snippet(String.valueOf(x)); 

      marker = map.addMarker(markerOptions);        
     } 

     @Override 
     public void onError() { 

      //create marker option         
      markerOptions = new MarkerOptions().position(marker_position).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder_pin)).snippet(String.valueOf(x)); 
      marker = map.addMarker(markerOptions); 

     } 
    }); 
} 

मैं का उपयोग करने की कोशिश की नहीं है के रूप में एक यूआरएल से मेरे मानचित्र के लिए मार्कर जोड़ रहा साथ यूआरएल से मार्कर जोड़ना मैं इसे लगभग 20 मार्कर जोड़ने के लिए एक लूप में कर रहा हूं लेकिन मुझे लगता है कि कोड के पहले भाग पर केवल 5 या 7 मार्कर जोड़े गए हैं, इसलिए मैंने इस तरह lib और एक AsyncTask का उपयोग करने के लिए स्विच किया है।

for(int x =0; x < mapIcon_url.length; x++){ 

    new AddMarker().execute(mapIcon_url[x]); 
} 


public class AddMarker extends AsyncTask<String, Integer, BitmapDescriptor> { 

    BitmapDescriptor bitmapMarker1; 
    VenueDetails myVenue; 

    @Override 
    protected BitmapDescriptor doInBackground(String... url) { 
     myUrl = url[0]; 
     try { 
      bitmapMarker1 = BitmapDescriptorFactory.fromBitmap(Picasso.with(getActivity()).load(myUrl).resize(marker_size, marker_size+15).get()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return bitmapMarker1; 
    } 

    protected void onPostExecute(BitmapDescriptor icon) { 

     try { 

      map.addMarker(new MarkerOptions().position(marker_position).icon(icon))); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

हालांकि मैं थोड़ा चिंतित जब मैं मार्करों के बहुत कहने के बारे में 100 मेरा प्रश्न होगा इस यह करने के लिए सबसे अच्छा तरीका है इस विधि मुझे कुछ मुद्दों पर दे सकता है और यदि नहीं क्या अन्य विकल्प कर सकते हैं मैं कोशिश करूँगा।

+0

मैं आपके पहले दृष्टिकोण को डीबग करने पर ध्यान केंद्रित करूंगा। यह निर्धारित करने के लिए कि आप मार्कर प्राप्त करने में असफल रहे हैं, ब्रेकपॉइंट्स या लॉगिंग स्टेटमेंट का उपयोग करें। – CommonsWare

+0

मैंने पिकासो वर्ग को कॉल करने से पहले, लक्ष्य के ऑनसिस और ऑनर ओवरराइड विधियों में लॉगिंग स्टेटमेंट का उपयोग किया था। लॉग दिखाते हैं कि देखो को 20 बार कहा जाता था, परसिस को कुछ बार कहा जाता था और ऑनर कभी नहीं बुलाया जाता था। –

+0

जेक ने कल पिकासो 2.0.0 जारी किया - यदि आप पहले से ऐसा नहीं कर चुके हैं तो आप कोशिश कर सकते हैं। अन्यथा, आप एक पुन: उत्पन्न परीक्षण केस बनाने और पिकासो परियोजना के साथ एक समस्या दर्ज करने का प्रयास कर सकते हैं। मुझे आपके पास जो कुछ है उसके साथ कोई विशेष समस्या नहीं दिख रही है। – CommonsWare

उत्तर

2

आपको प्रत्येक Target के लिए संदर्भ रखना होगा, अन्यथा जब कचरा कलेक्टर का आह्वान किया जाता है तो सिस्टम स्वचालित रूप से उन्हें रिलीज़ करता है।

तो, बेहतर समाधान प्रत्येक लक्ष्य को HashSet पर जोड़ता है और फिर onBitmapLoaded() और onBitmapFailed लक्ष्य से विधियों को सेट करता है, लक्ष्य को स्वयं सेट से हटा दें।

10

आपको प्रत्येक लक्ष्य के लिए संदर्भ रखना होगा, अन्यथा सिस्टम कचरा कलेक्टर का आह्वान होने पर स्वचालित रूप से उन्हें रिलीज़ करता है।

तो, बेहतर समाधान onBitmapLoaded में एक HashSet करने के लिए प्रत्येक लक्ष्य जोड़ने और फिर है() और लक्ष्य से onBitmapFailed तरीकों, सेट से लक्ष्य खुद को हटा दें।

सुझाव के लिए धन्यवाद, अब मेरा कोड पूरी तरह से काम करता है। कोड के टुकड़ों के नीचे जो आपके सुझाव को लागू करते हैं।

[...]//Global var 
    private Set<PoiTarget> poiTargets = new HashSet<PoiTarget>(); 
[...]  
private void somewhere(){ 
    PoiTarget pt; 
    for(Item item: data) { 
     m = map.addMarker(new MarkerOptions() 
       .position(new LatLng(item.latitude, item.longitude)) 
       .title(item.title)); 
     pt = new PoiTarget(m); 
     poiTargets.add(pt); 
     Picasso.with(context) 
      .load(mapImageURLString) 
      .into(pt); 
    } 
} 
[...] 
//-------------------------------------------------------- 
// Inner class 
//-------------------------------------------------------- 
    class PoiTarget implements Target{ 
     private Marker m; 

     public PoiTarget(Marker m) { this.m = m; } 

     @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
      m.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap)); 
      poiTargets.remove(this); 
      Tools.msg(" @+ Set bitmap for "+m.getTitle()+" PT size: #"+poiTargets.size()); 
     } 

     @Override public void onBitmapFailed(Drawable errorDrawable) { 
      Tools.msg(" @+ [ERROR] Don't set bitmap for "+m.getTitle()); 
      poiTargets.remove(this); 
     } 

     @Override public void onPrepareLoad(Drawable placeHolderDrawable) { 

     } 
    } 
+1

पिकासो 2.4.0 के साथ लक्ष्य इस तकनीक का उपयोग करके कचरा एकत्रित किया जा रहा है। क्या आपको इसे ठीक करने के लिए कोई सलाह है? – Imanol

+0

यह पिकासो 2.3.2 के लिए काम करने योग्य है। इस तरह लक्ष्य का उपयोग करने के बारे में नहीं पता था! – Robert

संबंधित मुद्दे