带有新目标的毕加索从第二次加载位图

Picasso with new Target loads bitmap from second time

下面是我的代码。在第一次导航到屏幕时调用 onPrepareLoad()。但它不会到达 onBitmapLoaded() 或 onBitmapFailed()。有人可以减轻一下。它总是只从缓存加载吗?如何处理。我只使用默认的缓存机制。不涉及外部存储器。就好像我在同一个屏幕/碎片上第二次导航一样,位图通过 onBitmapLoaded()

加载
    picasso.load(url)
            .noFade().into(new Target() {

        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                relativeLayout.setBackgroundDrawable(new BitmapDrawable(
                        bitmap));
                relativeLayout.invalidate();
            } else {

                relativeLayout.setBackground(new BitmapDrawable(
                        bitmap));
                relativeLayout.invalidate();
            }
            if (true)
                Log.d("onBitmap", "onBitmapLoaded");
            //
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            //
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            //
        }
    });

或者,我通过在 Layout 中放置一个 ImageView 来实现要求,并且我传递了我的 Layout 宽度和高度来缩放我的 ImageView。原因是我的 ImageView 的 getMeasuredWidth 始终为 0,而我的布局为我提供了 measuredWidth 和 measuredHeight(ImageView 的父级)

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:id="@+id/c_details"
            android:layout_weight="1"
            android:layout_marginBottom="@dimen/spacing_small">

        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/c_details_view"
            android:layout_alignParentTop="true"
            android:layout_weight="1"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="@dimen/spacing_small">
            </ImageView>

           <!--   Other Views goes here      -->

        </RelativeLayout>

            In my Fragement java file
            RelativeLayout cDetailsLayout = (RelativeLayout)                                                 rootView.findViewById(R.id.c_details);

            // passing following into Picasso call
            cDetailsLayout.getMeasuredWidth(),                 cDetailsLayout.getMeasuredHeight()

您没有在 Target 中获得回调的原因是它正在被垃圾收集。毕加索对它的引用很弱。它在 into() 方法的文档中说明:"This method keeps a weak reference to the Target..."。所以你必须自己把 Target 存储在一个字段中。