带有新目标的毕加索从第二次加载位图
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 存储在一个字段中。
下面是我的代码。在第一次导航到屏幕时调用 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 存储在一个字段中。