天天看点

Android Studio 使用Picasso框架加载图片(需要设置请求头)

在日常开发中,加载网络图片是一个常见的需求,而网上也有很多加载图片的框架,Picasso是目前比较流行的一款加载图片框架,它最简单的使用方法如下。

picasso.load(url).into(imageView);
           

但是这个请求url提交的请求与之前的请求就不在同一个会话上 ,如果我们需要让请求保持在同一个会话上,我们应该先定义个拦截器。该拦截器返回一个带Response,这个对象的请求头已经设置好我们想要的cookie了。

package com.zhang.oa.Interceptor;

import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;


public class RequestInterceptor implements Interceptor {

    String cookie = null;
    public RequestInterceptor(String cookie) {
        this.cookie = cookie;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder request = chain.request().newBuilder();
        request.addHeader("Cookie", cookie);
        return chain.proceed(request.build());
    }

}
           

接着在onCreate中编写代码实现网络图片的加载。

//加载网络图片
        final OkHttpClient okHttpClient = new OkHttpClient();
        //设置请求头,在同一个session
        okHttpClient.interceptors().add(new RequestInterceptor(getSharedPreferences("identify", Context.MODE_PRIVATE).getString("sessionId",null)));
        Picasso picasso = new Picasso.Builder(YZSQFJXQActivity.this).downloader(new OkHttpDownloader(okHttpClient)).build();
        picasso.load(url).into(imageView);
           

其中url为我们后端开发好的请求接口,imageView为前端的ImageView对象。 

有些时候,我们需要通过框架来获取图片的位图(Bitmap)进而可以进行文件的本地保存,Picasso框架也提供了这一功能,代码如下。

final OkHttpClient okHttpClient = new OkHttpClient();
        //设置请求头,在同一个session
        okHttpClient.interceptors().add(new RequestInterceptor(getSharedPreferences("identify", Context.MODE_PRIVATE).getString("sessionId",null)));
        final Picasso picasso = new Picasso.Builder(YZSQFJXQActivity.this).downloader(new OkHttpDownloader(okHttpClient)).build();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    //获取网络图片的位图
                    imageBitmap = picasso.load(url).get();
                    handler.sendEmptyMessage(0);
                }
                catch (Exception e){e.printStackTrace();}
            }
        }).start();
           

这样就可以获取网络资源的位图了,获取位图后可以调用ImageView中的setImageBitmap进行图片的设置。

handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                int tag = msg.what;
                switch (tag) {
                    //获取数据
                    case 0:
                        //设置位图
                        imageView.setImageBitmap(imageBitmap);
   
                        break;
                }
            }
        };
           

有了Bitmap后还可以进行图片的本地保存等功能。