因此,我目前正在调查使用Picasso库替换项目中的大量自定义图像加载AsyncTask
的可能性,这看起来很有希望。然而,有一个问题我并不完全确定如何使用毕加索来解决。
在这种情况下,我们正在为音乐曲目下载专辑封面,但是当我们要显示ListView时,我们只有轨道ID。首先,我们必须根据轨道ID查找Album Art URL,然后将其加载到ImageView中。目前我们有一个AsyncTask
,我们在doInBackground()
首先查找图片网址,然后从中加载Bitmap
,然后将其粘贴到onPostExecute
。
有没有办法使用Picasso进行预先查找,或者我们是否必须将Picasso调用包装在首先执行查找的AsyncTask
中(感觉它有点挫败了目的)。
更新:现在如何运作:
private class AlbumArtTask extends AsyncTask<String, Bitmap, Bitmap> {
@Override
protected Bitmap doInBackground(String... strings) {
final String id = strings[0];
// This part is what I'm asking for, basically to be able to make an Async
// lookup of the url that will later be used by Picasso
final Uri uri = getAlbumArtUriFromTrackId(id);
// Creating the Bitmap and return it to be used in an ImageView
// This part is handled by Picasso
return bitmap = createBitmapFromUri(uri);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
// load image into ImageView
}
}
更新2:构成我之后
的例子Picasso.with(mContext)
.load(new UriProvider() {
// Get the actual image URI here
public Uri getImageUri() {
return getAlbumArtUriFromTrackId(id);
}
})
// And load it here
.into(mImageView);
答案 0 :(得分:1)
我必须为我的应用解决同样的问题。我使用OkHTTP拦截器来重定向请求。
这是我的皮卡萨宣言:
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new PhotoInterceptor());
Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(client))
.build();
这是拦截器的基本实现:
public class PhotoInterceptor implements Interceptor {
Gson gson = new Gson();
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
if (response.isSuccessful()) {
Photo photo = gson.fromJson(response.body().charStream(), Photo.class);
if (photo!=null) {
request = request.newBuilder()
.url(photo.getPhoto_file_url())
.build();
response = chain.proceed(request);
}
}
return response;
}
}
答案 1 :(得分:0)
创建listView时,您必须使用Piccaso从相册艺术网址加载图片。然后在Track的Detail屏幕上,您必须调用实际图像URL以在imageview中设置它。
<强>被修改强>
{{1}}