如何使用Picasso保存和显示图像

时间:2015-12-02 18:40:24

标签: android android-contentprovider picasso

我对毕加索并不太熟悉,但我的应用程序使用它来加载他们的URL中的图像 但是我想制作一个按钮,当它被点击时,它会将图像标记为收藏,即使它处于离线状态也会显示它。
我正在使用Content Provider保存其他内容(字符串,双精度数)。

所以,我认为实现这一目标的最佳方法是将图像保存为甚至离线显示 但是如何保存它们?

2 个答案:

答案 0 :(得分:0)

使用网址下载图片还有另一个不错的选择。试试这段代码。

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

    new DownloadFile().execute("https://i.stack.imgur.com/w4kCo.jpg");
}
class DownloadFile extends AsyncTask<String,Integer,Long> {
    ProgressDialog mProgressDialog = new ProgressDialog(MainActivity.this);// Change Mainactivity.this with your activity name. 
    String strFolderName;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog.setMessage("Downloading Image ...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setCancelable(false);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.show();
    }
    @Override
    protected Long doInBackground(String... aurl) {
        int count;
        try {
            URL url = new URL((String) aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();
            String targetFileName="downloadedimage.jpg";//Change name and subname

            int lenghtOfFile = conexion.getContentLength();
            String PATH = Environment.getExternalStorageDirectory()+"/myImage/";
            File folder = new File(PATH);
            if(!folder.exists()){
                folder.mkdir();//If there is no folder it will be created.
            }
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(PATH+targetFileName);
            byte data[] = new byte[1024];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                       publishProgress ((int)(total*100/lenghtOfFile));
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {}
        return null;
    }
    protected void onProgressUpdate(Integer... progress) {
         mProgressDialog.setProgress(progress[0]);
         if(mProgressDialog.getProgress()==mProgressDialog.getMax()){
            mProgressDialog.dismiss();

            Toast.makeText(getApplicationContext(), "Download Completed !", Toast.LENGTH_LONG).show();

         }
    }
    protected void onPostExecute(String result) {
    }
}

将下载的图像位图设置为Imageview。

答案 1 :(得分:0)

这是代码。通过这种策略,毕加索将在缓存中查找图像,如果只是失败,那么图像将通过网络下载。

     Picasso.with(context)
                        .load(Uri.parse(getItem(position).getStoryBigThumbUrl()))
                        .networkPolicy(NetworkPolicy.OFFLINE)
                        .into(holder.storyBigThumb, new Callback() {
                            @Override
                            public void onSuccess() {

                            }

                            @Override
                            public void onError() {
                                // Try again online if cache failed
                                Picasso.with(context)
                                        .load(Uri.parse(getItem(position)
                                                .getStoryBigThumbUrl()))
                                .placeholder(R.drawable.user_placeholder)
                                .error(R.drawable.user_placeholder_error)
                                        .into(holder.storyBigThumb);
                            }
                        });

Picasso有自己的缓存,你不需要自己处理任何事情。