您的位置:首页 > 理论基础 > 计算机网络

OkHttp简单使用(未封装)

2016-10-19 21:22 423 查看
-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.
91c5
write(buff , 0 , hasRead);
}
}
});
}
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: