使用Picasso加载图像

时间:2016-09-02 15:22:49

标签: java android multithreading android-asynctask

我使用PicassoImage加载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);
            }
        });

现在我正在考虑使用AsyncTaskImage设置为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

2 个答案:

答案 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绑定到视图,否则可以在进程完成之前对其进行垃圾回收。