Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 毕加索目标已被垃圾回收_Android_Image_Loading - Fatal编程技术网

Android 毕加索目标已被垃圾回收

Android 毕加索目标已被垃圾回收,android,image,loading,Android,Image,Loading,早上好。我有一个带集群管理器的谷歌地图。很简单,我使用群集绘制标记分组或不分组的位置。无论如何,我从群集管理器得到了一个方法回调,它是群集项渲染。在该回调中,我将自定义图像应用于标记:标记中的用户图像。我发现毕加索最适合处理位图加载,同时也让我非常头疼。我使用Target从毕加索开始初始化位图回调:OnPreLoad、OnFail、OnBitmapLoaded。问题是在第一个集群项上呈现未调用的OnBitmapLoaded,通常不会调用,除非第二次触摸它。第一次时,不会发生任何事情,除了OnPr

早上好。我有一个带集群管理器的谷歌地图。很简单,我使用群集绘制标记分组或不分组的位置。无论如何,我从群集管理器得到了一个方法回调,它是群集项渲染。在该回调中,我将自定义图像应用于标记:标记中的用户图像。我发现毕加索最适合处理位图加载,同时也让我非常头疼。我使用
Target
从毕加索开始初始化位图回调:
OnPreLoad、OnFail、OnBitmapLoaded
。问题是在第一个集群项上呈现未调用的
OnBitmapLoaded
,通常不会调用,除非第二次触摸它。第一次时,不会发生任何事情,除了
OnPreLoad
之外,没有任何回调被触发。通过谷歌搜索,我发现伟大的毕加索对类的引用很弱。我尝试了谷歌的所有例子:使目标引用强大(从方法中获得类的初始化,并在我的类中初始化类,如下所示)

在这一点上,我得到了相同的结果…有时加载位图,有时不加载。大部分不是。。。 无论如何,我尝试将接口类实现到我自己的类中,如下所示:

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;
}
公共类PicassoMarkerView实现com.squareup.picasso.Target{
私有静态最终字符串TAG=“MarkerRender”;
私有位图mMarkerBitmap;
私人群集管理器McClusterManager;
私人市场;
专用标记器;
公共毕加索{
}
@凌驾
公共int hashCode(){
返回mMarker.hashCode();
}
@凌驾
公共布尔等于(对象o){
if(毕加索MarkerView的o实例){
标记器=((PicassoMarkerView)o).mMarker;
返回mMarker.equals(标记);
}否则{
返回false;
}
}
@凌驾
已加载位图(位图位图,Picasso.LoadedFrom){
位图缩放位图=位图。创建缩放位图(位图,
mMarkerBitmap.getWidth()-15,(int)(mMarkerBitmap.getHeight()/1.5-15),
假);
setIcon(BitmapDescriptorFactory.fromBitmap(叠加(mMarkerBitmap,缩放位图,8,7));
Log.d(标记“onBitmapLoaded:”);
}
@凌驾
公共无效onBitmapFailed(Drawable errorDrawable){
Log.d(标记“onBitmapFailed”);
}
@凌驾
准备加载时的公共无效(可提取占位符可提取){
Log.d(标签“onPrepareLoad:”);
}
专用位图覆盖(位图位图位图1、位图位图位图2、int left、int top){
Bitmap res=Bitmap.createBitmap(bitmap1.getWidth(),bitmap1.getHeight(),
bitmap1.getConfig());
画布=新画布(分辨率);
drawBitmap(位图1,新矩阵(),空);
drawBitmap(位图2,左,上,空);
返回res;
}
public void setMarkerBitmap(位图markerBitmap){
this.mMarkerBitmap=markerBitmap;
}
公共无效集合群集管理器(群集管理器群集管理器){
this.mClusterManager=clusterManager;
}
公共无效设置MarkerItem(MarkerItem-MarkerItem){
this.mMarkerItem=markerItem;
}
公共无效设置标记(标记){
this.mMarker=标记;
}
}

不幸的是,这也不起作用…同样的结果…所以请亲爱的朋友们,你能给我一个这样的工作示例吗?就我所能搜索的范围而言,问题主要发生在尝试在内部循环中执行此操作的用户身上,而我的
onClusterItemRender
某种循环,比如说,每当用户看到标记时,它都会被触发,所以是的,它被触发了好几次,速度和循环一样快,所以请给我一些想法,帮助我


重要的是,我不需要使用毕加索的方法,如
fetch(),get()
,因为它们不是必需的,也不适合应用程序的用途。

我遇到了类似的问题,保留对目标的引用根本没有帮助

我的项目的目的是使用2种不同的图像下载api来显示图像库,并让用户能够选择使用哪种api

除了毕加索,我还使用了Glide,我对结果感到惊讶,Glide的api在各个方面都完美无瑕。毕加索给了我地狱般的打击(那是我第一次使用Glide,到目前为止我通常使用毕加索,似乎今天它要变了)

所以我给你的建议是:

  • 使用滑翔过毕加索(在他们的目标上没有这样弱的参考)
  • 由于我必须同时使用这两个库,我最终在处理程序中使用了get(),不确定它是否能帮助您,但它解决了我的问题:


  • 我遇到了类似的问题,持有对目标的引用根本没有帮助

    我的项目的目的是使用2种不同的图像下载api来显示图像库,并让用户能够选择使用哪种api

    除了毕加索,我还使用了Glide,我对结果感到惊讶,Glide的api在各个方面都完美无瑕。毕加索给了我地狱般的打击(那是我第一次使用Glide,到目前为止我通常使用毕加索,似乎今天它要变了)

    所以我给你的建议是:

  • 使用滑翔过毕加索(在他们的目标上没有这样弱的参考)
  • 由于我必须同时使用这两个库,我最终在处理程序中使用了get(),不确定它是否能帮助您,但它解决了我的问题:


  • 救了我一天。现在我可以把它和RxJavaSaved结合起来了。现在我可以将其与RxJava结合起来
    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;
    }
    
    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);
                }
            }
        }
    });