回调奇怪的行为(Android,Picasso库)

vli*_*o20 2 java android callback picasso

我正在使用Picasso库来管理我的图像上传和缓存.当我尝试执行此代码时:

    Picasso.with(this)
        .load(AppServer.getImageUrl() + "/" + eventInfo.getImageName())
        .placeholder(R.drawable.calendar)
        .error(R.drawable.calendar)
        .into(new Target()
        {

            @Override
            public void onPrepareLoad(Drawable drawable) 
            {
            }

            @Override
            public void onBitmapLoaded(Bitmap photo, Picasso.LoadedFrom from)
            {
                cropImage(photo); //not getting here
            }

            @Override
            public void onBitmapFailed(Drawable arg0) 
            {
            }
        });  
Run Code Online (Sandbox Code Playgroud)

我没有进入onBitmapLoaded回调.只有当我关闭活动(返回)并重新打开它时,我才会看到图像(进入onBitmapLoaded).

但是,如果我只是通过ToastonPrepareLoad回调中添加一些消息来改变我的代码,那么每件事都可以.这是完整的代码:

    Picasso.with(this)
        .load(AppServer.getImageUrl() + "/" + eventInfo.getImageName())
        .placeholder(R.drawable.calendar)
        .error(R.drawable.calendar)
        .into(new Target()
        {

            @Override
            public void onPrepareLoad(Drawable drawable) 
            {
                Toast.makeText(thisActivity, "message", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onBitmapLoaded(Bitmap photo, Picasso.LoadedFrom from)
            {
                cropImage(photo);
            }

            @Override
            public void onBitmapFailed(Drawable arg0) 
            {
            }
        });
Run Code Online (Sandbox Code Playgroud)

为什么Toast能让它发挥作用?这有什么问题?

vli*_*o20 11

我通过将Target实例声明为类成员来解决问题.然后初始化它.像这样:

    target = new Target()
    {

        @Override
        public void onPrepareLoad(Drawable drawable) 
        {
        }

        @Override
        public void onBitmapLoaded(Bitmap photo, Picasso.LoadedFrom from)
        {
            cropEventImage(photo);
        }

        @Override
        public void onBitmapFailed(Drawable arg0) 
        {
        }
    };

    Picasso.with(this)
        .load(AppServer.getImageUrl() + "/" + eventInfo.getImageName())
        .placeholder(R.drawable.calendar)
        .error(R.drawable.calendar)
        .into(target);
Run Code Online (Sandbox Code Playgroud)

  • 原因是你的"目标"被垃圾收集,因为毕加索持有弱参考. (9认同)