OkHttp简单使用(未封装)

-1-OkHttp和Volley性能对比

(1)OkHttp的优点

-a-支持http请求,https请求 -b-支持文件下载

-c-使用HttpURLConnection,不用担心android版本的变更。(至少目前都是支持的)

-d-支持get,post请求 -e-基于Http的文件上传

-f-加载图片 -g-支持session的保持

(2)OkHttp的缺点

-a-比如callback回来是在子线程里面,不能刷新UI,需要我们手动处理

-b-封装比较麻烦

(3)Volley的优点

-a-非常适合进行数量不大,但通信频繁的网络操作 -b-内部封装了异步线程,可以在回调中操作UI

-c-支持get,post网络请求 -d-图片下载

-e-可直接在主线程调用服务端并处理返回结果 -f-可以取消请求,容易拓展,面向接口编程

(4)Volley的缺点

-a-对大文件下载Volley的表现非常糟糕 -b-只支持http请求

-c-图片加载性能一般 -d-使用的是HttpClient,HttpURLConnection

-2-Http Get请求

(1)首先构造一个OkHttpClient:

OkHttpClient mOkHttpClient = new OkHttpClient();

(2)然后通过Request.Builder构造一个Request对象,参数最起码有个url,其实还可以设置更多参数:如header,method等。

final Request request = new Request.Builder().url(“http://www.baidu.com“).build();

(3)然后通过OkHttpClient的newCall(传入request对象)得到一个Call对象,类似于将请求封装成了任务。

Call call = mOkHttpClient.newCall(request);

(4)最后,我们希望以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成后,在CallBack中即可得到结果。

OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder().url(“http://www.baidu.com“).build();
//new Call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
}
@Override
public void onResponse(Response response) throws IOException
{
Log.d(“MainActivity” , response.body().string());
}
});

注意:

-a-onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果想得到inputStream,则调用response.body().byteStream()。

能获得返回的inputStream,说明这里支持大文件下载,有inputStream就可以通过IO的方式写文件。

-b-onResponse执行的线程并不是UI线程,如果想操作控件,还是需要使用handler等。

-2-Http Post携带参数

post请求的时候,参数是包含在请求体中的,所以通过FormEncodingBuilder,添加多个String键值,然后通过FormEncodingBuilder的build()方法构造出RequestBody。

private void okHttpPostRequest()
{
    Log.d("MainActivity" , "ok");
    OkHttpClient mOkHttpClient = new OkHttpClient();
    FormEncodingBuilder builder = new FormEncodingBuilder();
    builder.add("name" , "crazyit.org");
    builder.add("pass" , "leegang");

    final Request request = new Request.Builder().url("http://192.168.1.100:8080/foo/login.jsp")
            .post(builder.build()).build();

    Call call = mOkHttpClient.newCall(request);
    call.enqueue(new Callback()
    {
        @Override
        public void onFailure(Request request, IOException e)
        {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Response response) throws IOException
        {
            Log.d("MainActivity" , response.body().string());
        }
    });
}

-3-使用OkHttp下载图片

private void okHttpLoadImage()
{
    OkHttpClient okHttpClient = new OkHttpClient();
    final Request request = new Request.Builder().url("http://192.168.1.100/montain.jpg").build();
    Call call = okHttpClient.newCall(request);

    call.enqueue(new Callback()
    {
        @Override
        public void onFailure(Request request, IOException e)
        {
        }
        @Override
        public void onResponse(Response response) throws IOException
        {
            final byte[] datas = response.body().bytes();
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    image.setImageBitmap(BitmapFactory.decodeByteArray(datas , 0 , datas.length));
                }
            });
        }
    });
}

-4-使用OkHttp下载文件

private void loadImageToFile()
{
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    {
        try
        {
            String sdCardDir = Environment.getExternalStorageDirectory().getCanonicalPath();
            raf = new RandomAccessFile(sdCardDir + "/montain.jpg" , "rw");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder().url("http://192.168.1.100/montain.jpg").build();
        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e)
            {
            }
            @Override
            public void onResponse(Response response) throws IOException
            {
                InputStream in = response.body().byteStream();
                byte[] buff = new byte[1024];
                int hasRead;
                while ((hasRead = in.read(buff)) > 0)
                {
                    raf.write(buff , 0 , hasRead);
                }
            }
        });
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值