赞
踩
OkHttp是由鼎鼎大名的Square公司开发的。OkHttp不仅在接口封装上面做的简单易懂,就连在底层实现上也自成一派。
在使用OkHttp之前,我们需要在Android Studio上app/build.gradle文件中添加它的依赖
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.4.1'
}
下面就来看看OkHttp的具体用法
GET请求(同步请求)
private void getDataWithOkHttp() { //开启子线程发起网络请求 new Thread( new Runnable() { @Override public void run() { try{ //创建OkHttpClient实例对象 OkHttpClient okhttpclient = new OkHttpClient(); //发起请求 url()方法设置目标的网络地址 Request request = new Request.Builder() .url( "http://www.baidu.com" ) .build(); //调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据 //其中Response对象就是服务器返回的数据 Response response = okhttpclient.newCall( request ).execute(); //通过下列数据得到返回的具体数据内容 String responseData = response.body().string(); //显示获取得到的数据 showResponse( responseData ); }catch (Exception e){ e.printStackTrace(); } } } ).start();//start()开启线程 }
Android是不允许在子线程中进行UI操作,我们需要通过runOnUiThread()方法将线程切换到主线程,然后更新UI元素
private void showResponse(final String response) {
runOnUiThread( new Runnable() {
@Override
public void run() {
//在这里进行UI操作,将结果显示到界面上
//result是一个TextView,代码中没有定义绑定控件,读者使用时,可自行定义
result.setText( response );
}
} );
}
GET请求(异步请求)
private void getDataWithOkHttp() { // OkHttpClient client = new OkHttpClient(); //请求体 Request request = new Request.Builder() .url("http://www.baidu.com") .build(); // enqueue()方法 ,发送请求并获取返回数据 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(“Test”,"获取数据失败了"+e.toString()); } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){//回调的方法执行在子线程。 Log.d("Test","获取数据成功了"); Log.d("Test","response.code()=="+response.code()); Log.d("Test","response.body().string()=="+response.body().string()); //通过下列数据得到返回的具体数据内容 String responseData = response.body().string(); //显示获取得到的数据 showResponse( responseData ); } } }); }
最大的不同点就是异步请求不需要开启子线程,enqueue方法会自动将网络请求部分放入子线程中执行。
POST请求(同步请求)
public void sendRequestWithOkHttp( ){ //开启子线程发送请求 new Thread( new Runnable() { @Override public void run() { try{ //创建OkHttpClient实例对象 OkHttpClient okHttpClient = new OkHttpClient(); //请求体 RequestBody requestBody = new FormBody.Builder() .add("username", "admin") .add("password", "123456") .build(); //包装请求 Request request = new Request.Builder() .url( "http://www.baidu.com") .post(requestBody) .build(); //execute()方法,发送请求并获取返回数据 Response response = okHttpClient.newCall( request ).execute(); String responseData = response.body().string(); //显示返回数据 showResponse( responseData ); }catch (Exception e){ Log.i("Test","error" ); e.printStackTrace(); } } } ).start(); }
POST请求(异步请求)
//url是访问的服务器网址,userJsonStr是包装好的Json串 public void postData(String url, String userJsonStr){ //异步请求 //执行post操作 //创建OkHttpClient的对象 OkHttpClient client = new OkHttpClient(); //请求体 RequestBody requestBody = new FormBody.Builder() .add( "reqJson",userGsonStr ) .build(); //包装请求 Request request = new Request.Builder() .url( url ) .post( requestBody ) .build(); //发送请求并获取返回数据 client.newCall( request ).enqueue( new Callback() {//enqueue方法是异步请求 @Override public void onFailure(Call call, IOException e) { //这里是子线程 Log.d(TAG,"获取数据失败了"+e.toString()); runOnUiThread( new Runnable() { @Override public void run() { Toast.makeText( MainActivity.this, "数据出错", Toast.LENGTH_SHORT ).show(); } } ); } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){//回调的方法执行在子线程。 Log.d(TAG,"获取数据成功了"); Log.d("Test","response.code()=="+response.code()); final String str = response.body().string(); Log.d(TAG,"response.body().string()=="+str); //切换线程 runOnUiThread(new Runnable() { @Override public void run() { result.setText( str ); Toast.makeText( MainActivity.this,str,Toast.LENGTH_SHORT ).show(); } }); } } } ); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。