2013-08-31 3 views
8

でURLからマーカーを追加すると、私は私はマーカーとして<a href="http://square.github.io/picasso/" rel="noreferrer">Picasso library</a></p> <p>を使用してURLからマイマップにマーカーを追加しているピカソ

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); 

     } 
    }); 
} 

代わりにターゲットを使用しようとしたImageViewのではありませんこれをループして約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

ピカソクラスを呼び出す直前に、ターゲットのonSucessメソッドとonErrorオーバーライドメソッドでloggingステートメントを使用しました。ログは外観が20回呼び出されたことを示し、onSucessは数回呼び出され、onErrorは決して呼び出されませんでした。 –

+0

Jakeは昨日Picasso 2.0.0をリリースしました。それ以外の場合は、再現可能なテストケースを作成し、Picassoプロジェクトで問題を提出してみてください。私はあなたが持っているものに特別な問題は見ません。 – CommonsWare

答えて

2

Targetの参照を保持する必要があります。そうしないと、ガベージコレクタが呼び出されたときにシステムによって自動的に解放されます。

したがって、各ターゲットをHashSetに追加し、次にonBitmapLoaded()とのターゲットに追加する方がよい場合は、ターゲットからターゲットを削除してください。

10

各ターゲットの参照を保持する必要があります。そうでなければ、 は、ガベージコレクタが呼び出されたときにシステムを自動的に解放します。

したがって、各ターゲットをHashSetに追加し、次に onBitmapLoaded()および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

Picasso 2.4.0では、このテクニックを使用してターゲットがガベージコレクションされています。それを修正するためのアドバイスはありますか? – Imanol

+0

これはPicasso 2.3.2でも有効です。前にこのようなターゲットを使用する方法がわからなかった! – Robert

関連する問題

 関連する問題