2016-06-20 2 views
1

좋은 하루입니다. 클러스터 매니저가있는 Google지도가 있습니다. 클러스터 하나를 사용하여 클러스터 된 마커를 그릴 수 있습니다. 어쨌든 클러스터 항목 인 클러스터 관리자로부터 메소드 콜백을 받았습니다. render.Inside 그 콜백 내 마커에 사용자 정의 이미지를 적용하고 있습니다 : 마커 안에있는 사용자 이미지. 피카소가 비트 맵 로딩을 처리하는 데 가장 좋았고 동시에 두통을 많이 겪었습니다. 피카소의 Target 클래스를 사용하고 있습니다. 비트 맵 콜백을 시작하려면 OnPreLoad,OnFail,OnBitmapLoaded입니다. 문제는 첫 번째 클러스터 항목에서 onBitmapLoaded이 호출되지 않고 두 번째로 터치되지 않으면 호출되지 않는다는 것입니다. 처음에는 아무 것도 발생하지 않으며 OnPreLoad을 제외한 콜백이 트리거되지 않습니다. 인터넷 검색 결과 나는 위대한 피카소가 수업에 대한 약한 언급을하고 있음을 발견했다. LL 구글의 예 : 대상 참조가 강한 지 (방법에서 클래스의 initialazation을 가져오고 다음과 같은 내 클래스 내에서 클래스를 초기화하기) 만드는이 시점에서피카소 타겟은 가비지 수집되었습니다

@Override 
protected void onClusterItemRendered(MarkerItem clusterItem, Marker marker) { 
    mMarker = marker; 
    mMarkerItem = clusterItem; 

    Picasso.with(mContext).load(clusterItem.getImageUrl()).transform(new CircleTransformation()).into(target); 
} 



private Target target = new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     Log.d(TAG, "onBitmapLoaded: "); 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     Log.d(TAG, "onBitmapFailed: "); 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) { 
     Log.d(TAG, "onPrepareLoad: "); 
    } 
}; 
@Override 
protected void onBeforeClusterItemRendered(MarkerItem item, MarkerOptions markerOptions) { 
    markerOptions.title(item.getTitle()); 
    markerOptions.icon(item.getIcon()); 
} 

내가 같은 결과를 얻을 .... 때때로 비트 맵로드 때로는 not.Mostly ... 어쨌든 나는 다음과 같이 내 자신의 클래스에 인터페이스를 구현하려하지 :

public class PicassoMarkerView implements com.squareup.picasso.Target { 
private static final String TAG = "MarkerRender"; 
private Bitmap mMarkerBitmap; 
private ClusterManager<MarkerItem> mClusterManager; 
private MarkerItem mMarkerItem; 
private Marker mMarker; 

public PicassoMarkerView() { 

} 


@Override 
public int hashCode() { 
    return mMarker.hashCode(); 
} 

@Override 
public boolean equals(Object o) { 
    if (o instanceof PicassoMarkerView) { 
     Marker marker = ((PicassoMarkerView) o).mMarker; 
     return mMarker.equals(marker); 
    } else { 
     return false; 
    } 
} 


@Override 
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 
      mMarkerBitmap.getWidth() - 15, (int) (mMarkerBitmap.getHeight()/1.5 - 15), 
      false); 
    mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(overlay(mMarkerBitmap, scaledBitmap, 8, 7))); 
    Log.d(TAG, "onBitmapLoaded: "); 
} 

@Override 
public void onBitmapFailed(Drawable errorDrawable) { 
    Log.d(TAG, "onBitmapFailed: "); 
} 

@Override 
public void onPrepareLoad(Drawable placeHolderDrawable) { 
    Log.d(TAG, "onPrepareLoad: "); 
} 


private Bitmap overlay(Bitmap bitmap1, Bitmap bitmap2, int left, int top) { 
    Bitmap res = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), 
      bitmap1.getConfig()); 

    Canvas canvas = new Canvas(res); 

    canvas.drawBitmap(bitmap1, new Matrix(), null); 
    canvas.drawBitmap(bitmap2, left, top, null); 

    return res; 
} 


public void setMarkerBitmap(Bitmap markerBitmap) { 
    this.mMarkerBitmap = markerBitmap; 
} 

public void setClusterManager(ClusterManager<MarkerItem> clusterManager) { 
    this.mClusterManager = clusterManager; 
} 

public void setMarkerItem(MarkerItem markerItem) { 
    this.mMarkerItem = markerItem; 
} 

public void setMarker(Marker marker) { 
    this.mMarker = marker; 
} 

}

Unfortunatally이 역시 작동하지 않습니다 .. 똑같은 결과 ... 그래서 e 친애하는 친구 당신이 내게 작동 예제를 줄 수 있습니까? 최대한 멀리 내가 할 수있는이 문제는 주로 내부 루프 및 내 onClusterItemRender 일종의 일종의 할 시도하는 사용자가 발생합니다 때마다 트리거되는 말할 수 있습니다 사용자가 볼 수 있으므로 루프가 여러 번 트리거되므로 몇 가지 아이디어를 내게 알려주세요.

중요한 것은 피카소의 메서드를 fetch(),get()과 같이 사용할 필요가 없다는 것입니다. 앱의 목적에 부합하지 않아도됩니다.

답변

5

비슷한 문제가 발생하여 대상에 대한 참조가 전혀 도움이되지 않았습니다.

내 프로젝트의 목적은 이미지 갤러리를 보여주고 사용자가 사용할 API를 선택할 수있는 능력을 부여하기 위해 두 가지 이미지 다운로드 API를 사용하는 것이 었습니다.

피카소 옆 나는 글라이드를 사용했는데 그 결과에 놀랐다. 글라이드의 API는 피카소가 나에게 준 모든면에서 완벽하게 작동했다. (글라이드를 처음 사용했을 때 나는 보통 피카소를 사용했다. 갈거야 ^^).

그래서 나의 제안은 다음과 같습니다 피카소 이상

  1. 사용 글라이드 (자신의 목표에 이런 약한 참조).
  2. 내가 당신을 도울 것입니다 경우 처리기, 확실하지에서 나는() GET을 사용하여 결국 두 라이브러리를 사용했다하지만 내 문제 해결 이후 : 내 하루

handlerThread = new HandlerThread(HANDLER_THREAD_NAME); 
handlerThread.start(); 

Handler handler = new Handler(handlerThread.getLooper()); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     Bitmap bitmap = null; 
     try { 
      bitmap = picasso.with(appContext).load(url).get(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally { 
      if (bitmap != null) { 
       //do whatever you wanna do with the picture. 
       //for me it was using my own cache 
       imageCaching.cacheImage(imageId, bitmap); 
      } 
     } 
    } 
}); 
+0

을 저장합니다. 이제 이것을 RxJava와 결합 할 수 있습니다. – gorodechnyj

관련 문제