在安卓中从Picasso下载多张图片

6
我正在使用Picasso库从URL下载图片。这是我第一次尝试使用Picasso。
场景:我想从服务器下载一些图片并将它们存储到文件中。我知道如何存储到文件和检索。当我运行下面的代码时,我发现我只得到最后一个图片。似乎Picasso是并行运行的。我通过显示toast消息来检查它。有没有办法解决这个问题?
问题:我只得到了最后一个url图片。
这是我的代码:
static int  count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    for (int i = 0; i < url.length; i++)
    {

        // url is String array which has 2 urls. 
        ++count;   // Incrementing the count by 1
        Picasso.with(this).load(url[i])
        .into(new Target() {

            @Override
            public void onPrepareLoad(Drawable arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) {
                // TODO Auto-generated method stub
                arg0 = Bitmap.createScaledBitmap(arg0, 150, 150, true);
                filePath = saveFile(arg0);   // I'm just calling this function to check how many times `onBitmapLoaded` is called. And it is called only once...!!
            }

            @Override
            public void onBitmapFailed(Drawable arg0) {
                // TODO Auto-generated method stub

            }
        });
    }
}

public String saveFile (Bitmap bm)
{

   Toast.makeText(getApplicationContext(), ""+count, 100).show(); // Displaying the value of count, which always display as **2**. 
   return "";
}

是的,它总是显示计数2,因为当您第一次加载图像位图时,迭代中的计数已达到值2。 - Haresh Chhelana
你说得十分正确。谢谢 @Haresh。所以,我可以用这段代码将许多图像保存到文件中? - Aniruddha
我已经发布了答案,现在您可以查看并更清楚地了解它。 - Haresh Chhelana
你有没有看到我的回答? - Haresh Chhelana
6个回答

4

这是一个完美的答案,我已经测试过了,它能够完美地工作。你需要使用一个专用线程从网络中获取多个图像。

private class loadImg extends AsyncTask<Void,Integer,Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {
                for(int i=0;i<mAdapter.getItemCount();i++){
                    Object object = mAdapter.getItem(i);
                    final String link = object.getImageLink();//"YOUR IMAGE LINK OR STRING";
                    if(link!=null && !link.isEmpty()) {
                        Bitmap bitmap = Picasso.with(context).load(link).get();
                        publishProgress(i);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            mAdapter.notifyItemChanged(values[0]);
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }

您可以在主线程的任何位置调用异步任务 (AsyncTask)。

new loadImg().execute;

4
尝试这种方式,希望这能帮助您解决问题。
static int  count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    for (int i = 0; i < url.length; i++)
    {

        // url is String array which has 2 urls. 
        Picasso.with(this).load(url[i])
        .into(new Target() {

            @Override
            public void onPrepareLoad(Drawable arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) {
                // TODO Auto-generated method stub
                arg0 = Bitmap.createScaledBitmap(arg0, 150, 150, true);
                ++count; // Incrementing the count by 1
                filePath = saveFile(arg0);   // I'm just calling this function to check how many times `onBitmapLoaded` is called. And it is called only once...!!
            }

            @Override
            public void onBitmapFailed(Drawable arg0) {
                // TODO Auto-generated method stub

            }
        });
    }
}

public String saveFile (Bitmap bm)
{

   Toast.makeText(getApplicationContext(), ""+count, 100).show(); // Displaying the value of count, which always display as **2**. 
   return "";
}

4
针对此事,您应该使用专用线程,并使用.get()而不是.into() - Jake Wharton

1
Picasso.with(MainActivity.this).load(Uri.parse(card.getField("profile_picture_url"))).into(viewHolder.tvPersence);

在你的getView()方法中使用这段代码。

0

不要以这种方式使用该方法,而是进行调用,并根据响应调用下一个方法。 例如:method1 -> error(), result

在两个位置处理URL列表并调用相同的方法。


抱歉,我没有理解您的意思。能否请您详细说明一下?或者提供伪代码? - Aniruddha

0
Picasso.with(context).load(url).into(imageview);

在这种方法中,图像加载取决于您的互联网速度来下载图像。


0
    final ImageView iv = new ImageView(context);

    Picasso.with(context).load(resultImageUrl).into(iv, 
       new Callback() {
           @Override
           public void onSuccess() {
              // Picasso successfully loaded image from resultImageUrl

              Bitmap bitmap = ((BitmapDrawable) 
              iv.getDrawable()).getBitmap();

              ImageStorage.saveToSdCard(context, bitmap, imageName);

              onFinishDownloading(results);
           }

           @Override
           public void onError() {
              // Picasso has failed to load image from resultImageUrl

              onFinishDownloading(results);
           }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接