我正在使用Picasso从URL加载一个Image,在我运行应用程序后,我发现“应用程序可能在其主线程上做了太多的工作”。为了设置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);
}
}但问题是,我在doInBackground方法中将图像设置为ImageView。所以我认为这需要在UI线程中完成。您能告诉我如何使用AsyncTask设置Image吗
发布于 2016-09-12 18:09:48
您不需要使用AsyncTask或后台线程来使用Piccaso加载图像。毕加索已经进行了优化。它有自己的异步调用。你所遇到的问题
“应用程序可能在其主线程上做了太多工作”
不是由于毕加索的作品。您可以参考this链接查看"Application may be doing too much work on its main thread"背后的原因
发布于 2016-09-02 23:39:03
使用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绑定到视图,否则可能会在该过程完成之前对其进行垃圾回收。
https://stackoverflow.com/questions/39295874
复制相似问题