我使用Picasso
从Image
加载URL
,运行应用程序后,我会看到"应用程序可能做得太多了在其主要线程上工作"。要设置Image
我写这样的东西:
Picasso.with(ScrollingActivity.this).load(photoUrl).networkPolicy(NetworkPolicy.OFFLINE).into(userProfileImageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
with(ScrollingActivity.this).load(photoUrl).into(userProfileImageView);
}
});
现在我正在考虑使用AsyncTask
将Image
设置为ImageView
,为此我将代码修改为:
但现在我不知道用doInBackground
方法和onPostExecute
方法写什么。
我使用了AsyncTask
这样的方法:
class SetImageTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... voids) {
Picasso.with(ScrollingActivity.this).load(photoUrl).networkPolicy(NetworkPolicy.OFFLINE).into(userProfileImageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
with(ScrollingActivity.this).load(photoUrl).into(userProfileImageView);
}
});
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
但问题是我将图片设置为ImageView
方法中的doInBackground
。所以我认为需要在UI线程中完成。您能否告诉我如何使用Image
AsyncTask
答案 0 :(得分:1)
您不需要使用AsyncTask
或后台线程来使用Piccaso
加载图片。毕加索已经过优化。它有自己的异步调用。你遇到的问题
&#34;应用程序可能在其主线程&#34;
上做了太多工作
不是由于毕加索。您可以参考this链接查看"Application may be doing too much work on its main thread"
答案 1 :(得分:0)
使用Target
,您不需要AsyncTask
,因为它会在后台解码。
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//do whatever you need in here
}
@Override
public void onBitmapFailed() {
}
}
private void loadBitmap() {
Picasso.with(this).load("url").into(target);
}
确保将Target
绑定到视图,否则可以在进程完成之前对其进行垃圾回收。