okhttp下载图片

Android系统提供两种HTTP通信类,HttpURLConnection(原始,需要程序员大量的封装)HttpClient(Apache组织提供,冗余代码比较多)

尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比httpClient功能太少,需要手头封装.(可是Androidapi23中删除HttpClient的相关类,谷歌推荐使用OKhttp)

okhttp是一个相对成熟的解决方案,Android API19 4.4的源码中可以看到HttpURLConnection已经替换成了okHttp.

 

支持HTTP/2 协议,允许连接到同一个主机地址的所有请求共享Socket,提高请求效率。

HTTP/2协议不可用的情况下,通过连接池减少请求的延迟。

GZip透明压缩减少传输的数据包大小。

响应缓存,避免同一个重复的网络请求。

okhttp的优势:
允许连接到同一个主机地址的所有请求,提高请求效率。
共享Socket,减少对服务器的请求次数
通过连接池,减少了请求延迟
缓存响应数据来减少重复的网络请求
减少了对数据流量的消耗
自动处理GZip压缩

步骤:
创建Module,关联OKhttp框架,,添加网络权限


完成Module的布局及控件的初始化


创建OkHttpClient对象及Request设置参数


创建Call对象,调用enqueue方法,开启异步请求


创建Handler,完成对下载的图片进行UI更新

具体代码如下:

public class DownPicActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_ok;
    private ImageView imgShow;

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


    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    //通过Message拿到字节数组
                    byte[] picture= (byte[]) msg.obj;
                    //使用BitmapFactory将字节数组转换为bitmap
                    Bitmap bitmap = BitmapFactory.decodeByteArray(picture,0,picture.length);
                    //通过imgview,设置图片
                    imgShow.setImageBitmap(bitmap);

                    break;
                case 2:
                    Toast.makeText(DownPicActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
                    break;

            }
        }
    };

    private void initView() {
        btn_ok = (Button) findViewById(R.id.btn_ok);
        imgShow = (ImageView) findViewById(R.id.imgShow);

        btn_ok.setOnClickListener(this);
    }

    private static final String PATH = "http://g.hiphotos.baidu.com/zhidao/pic/item/1e30e924b899a901da2aece318950a7b0308f5cc.jpg";

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //根据点击事件,获取图片资源.使用httpclient框架
            case R.id.btn_ok:
                //创建okhttpclient对象,
                OkHttpClient okHttpClient = new OkHttpClient();
                //建立Request.Builder对象,设置参数,如果请求方式是get就不用设置(默认为get).
                Request request = new Request.Builder()
                        .url(PATH) //设置请求网址
                        .build();//建立request对象
                //创建一个Call对象,参数为request对象,发送请求
                Call call = okHttpClient.newCall(request);
                //异步请求,请求加入调度
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        handler.sendEmptyMessage(2);
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                    //得到从网上获取资源,转换成我们想要的类型
                        byte[] bt =response.body().bytes();
                        //通过handler更新UI
                        Message message =handler.obtainMessage();
                        message.obj=bt;
                        message.what=1;
                        handler.sendMessage(message);
                    }
                });
                break;
        }
    }
}

你可能感兴趣的:(okhttp)