【问题标题】:Loading Image using picasso inside AsyncTask在 AsyncTask 中使用 picasso 加载图像
【发布时间】:2015-03-16 15:06:27
【问题描述】:

我正在使用 picasso 加载图像作为我的活动的背景,我想使用 AsyncTask,而图像正在加载,完成后进度条消失以使我的应用程序具有更好的外观,

这是我的代码:

  private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog = new ProgressDialog(MainActivity.this);
        mProgressDialog.setMessage("Chargement...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.show();

    }

    @Override
    protected Void doInBackground(Void... params) {
           Picasso.with(MainActivity.this).load("http://tv2.orangeadd.com/mediacenter-data/ofc__bg_home.jpg").into(background,new com.squareup.picasso.Callback() {
                 @Override
                 public void onSuccess() {
               mProgressDialog.dismiss();
                 }

                 @Override
                 public void onError() {

                 }
             }); 
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {





    }
    }

这总是显示错误并强制我的应用程序退出!

谢谢大家:)

【问题讨论】:

  • 它显示什么错误? logcat 里有什么?
  • 我猜毕加索图像加载不需要 AsyncTask 因为 Picasso.with(Context).load("url").into(imageview) 将调用传递给工作线程,你可以在 UI(Main) Thread 中调用这一行。
  • 我猜你对Picasso 的工作原理缺乏一些基本的了解,因为你做的事情看起来有点……奇怪。请查阅文档square.github.io/picasso
  • 谢谢你们,我更了解毕加索的工作原理

标签: android android-asynctask picasso


【解决方案1】:
public void loadImageInBackground() {

        mProgressDialog = new ProgressDialog(MainActivity.this);
        mProgressDialog.setMessage("Chargement...");
        mProgressDialog.setIndeterminate(false);

        Target target = new Target() {

            @Override
            public void onPrepareLoad(Drawable arg0) {

                mProgressDialog.show();
            }

            @Override
            public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) {

                background.setImageBitmap(arg0);
                mProgressDialog.dismiss();
            }

            @Override
            public void onBitmapFailed(Drawable arg0) {
                // TODO Auto-generated method stub
                mProgressDialog.dismiss();
            }
        };

        Picasso.with(MainActivity.this)
                .load("http://tv2.orangeadd.com/mediacenter-data/ofc__bg_home.jpg")
                .into(target);
    }

【讨论】:

    【解决方案2】:

    您收到错误是因为 picasso 的加载函数已经是异步的。因此,您可以在 UI 线程中执行此操作,例如:

    public void functionCalledFromUIThread(){
    
    mProgressDialog = new ProgressDialog(MainActivity.this);
    mProgressDialog.setMessage("Chargement...");
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.show();
    Picasso.with(MainActivity.this).load("http://tv2.orangeadd.com/mediacenter-data/ofc__bg_home.jpg").into(background,new com.squareup.picasso.Callback() {
                 @Override
                 public void onSuccess() {
                    mProgressDialog.dismiss();
                 }
    
                 @Override
                 public void onError() {
                    mProgressDialog.dismiss();
                 }
             }); 
    }
    

    【讨论】:

      【解决方案3】:

      我的猜测是错误是因为您试图在后台线程中修改 UI 元素(对话框),这是不可能的。

      您不需要AsyncTask,因为Picasso 已经在后台进行解码。

      【讨论】:

        猜你喜欢
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 2019-08-14
        • 2019-06-27
        • 1970-01-01
        相关资源
        最近更新 更多