听说点赞关注的人,身体健康,万事如意,工作顺利,爱情甜蜜,一夜暴富,升职加薪……最终迎娶白富美!!!
‼️微信公众号:炜煜工作室
🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱
使用HttpClient框架有点负责,每次进行网络交互时,一些复杂的网络操作及异常处理都非常繁琐。并且Android Stdio也对HttpClient框架做了一些限制,下面介绍okHttp框架。
优点:
1.创建OkHttpClient对象,并设置连接超时时间(读取的可写可不写)
OkHttpClient mOkHttpClient = ``new` `OkHttpClient();
注意:这种设置超时时间是OKhttp2.0特有的通过方法来进行设置
mOkHttpClient.setConnectTimeout(``10``,TimeUnit.SECONDS);``mOkHttpClient.setReadTimeout(``10``,TimeUnit.SECONDS);
mOkHttpClient.setWriteTimeout(``10``,TimeUnit.SECONDS);
提示:设置超时时间在OKhttp3.0以后,使用build的方式进行
OkHttpClient okHttpClient =new OkHttpClient.Builder().connectTimeout(`10`, TimeUnit.SECONDS).readTimeout(``10``,TimeUnit.SECONDS).writeTimeout(``10``,TimeUnit.SECONDS).build();
//02.通过build来创建一个Request请求,没有设置get,而是直接设置一个url地址,默认就是一个get方式
final` `Request request = ``new` `Request.Builder()
url(``"https://xxxx.易大师.xxxxx"``)` ` .build();
//03.创建一个call对象,参数就是Request请求对象,发送请求
Call call = mOkHttpClient.newCall(request);
``//04.请求加入调度 `` ``call.enqueue(``new` `Callback() ``
``{ ``//请求失败执行的方法``
``public` `void` `onFailure(Request request, IOException e){}``
``//请求成功执行的方法,response就是从服务器得到的参数,response.body()可以得到任意类型,字符串,字节
`` ``public` `void` `onResponse(``final` `Response response) ``throws` `IOException { `` ``
//这段代码可以拿到服务器的字符串.(通过response.body还可以拿到多种数据类型)`` ``//String
htmlStr = response.body().string(); ``
``} ``
``});
get请求的步骤总结:首先构造一个Request对象,参数必须有个url参数,当然可以通过Request.Builder设置更多的参数比如:header、method等。
然后通过request的对象去构造得到一个Call对象,类似于将请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。
最后,以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,在Callback中即可得到结果。
整体的写法还是比较长的,所以封装肯定是要做的。
okhttp注意:
onResponse回调的参数是response,一般情况下
不过也说明一个问题,这个onResponse执行的线程并不是UI线程(主线程不能有耗时操作)。如果希望操作控件,还是需要使用handler等
例如:``public` `void` `onResponse(``final` `Response response) ``throws` `IOException``{`` ``final` `String res = response.body().string();`` ``runOnUiThread(``new` `Runnable()`` ``{`` ``public` `void` `run()`` ``{`` ``TextView控件对象.setText(res);`` ``}`` ``});``}
这里是异步的方式去执行,也支持阻塞的方式,Call有一个execute()方法,可以直接调用call.execute()通过返回一个Response,最下面的代码就是
(二) Http Post 携带参数的使用步骤:
与get请求格式基本一致,就是Request的构造的不同。基于Http的文件,字符串,键值上传 [1]
``//0.0.RequestBody里所使用的上传参数的设定.(传一个字符串)`` ``定义为成员变量:JSON:MediaType JSON = MediaType.parse(``"application/json; charset=utf-8"``);``//"类型,字节码"`` ``String json = ``"{\n"` `+ ``"\"name\": \"hello.android6.0\"\n"` `+ ``"}"``;``//就是一个字符串. `` ``//0.0.通过post传一个文件,非常方便. `` ``MediaType FIle = MediaType.parse(``"application/octet-stream"``); `` ``File file = ``new` `File(Environment.getExternalStorageDirectory(), ``"文件名.mp4"``);``//得到一个mp4的文件,file对象` ` ``//01.创建OkHttpClient对象.`` ``OkHttpClient mOkHttpClient=``new` `OkHttpClient(); `` ``//02.通过create,创建一个RequestBody(参数1:数据类型 参数2:字符串,文件,byte数组..)`` ``RequestBody requestBody = RequestBody.create(JSON, json);`` ``//RequestBody requestBody = RequestBody.create(FIle , file );//上传一个文件的话`` ``//03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入.`` ``Request request = ``new` `Request.Builder()`` ``.url(``"http://XXX/易大师/YYY"``)`` ``.post(requestBody对象)`` ``.build();`` ``//04.创建一个call对象( 也可以省略的写为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});)`` ``Call call = mOkHttpClient.newCall(request对象);`` ``//05.请求加入调度(发送请求)`` ``call.enqueue(``new` `Callback()`` ``{ ``//请求失败执行的方法`` ``public` `void` `onFailure(Request request, IOException e){}`` ``//请求成功执行的方法,response就是从服务器得到的参数`` ``public` `void` `onResponse(``final` `Response response) ``throws` `IOException`` ``{`` ``//String htmlStr = response.body().string();`` ``}`` ``});
注意:后面的就和上面一样了。
(三)使用post进行表单(键值对)上传
(上一个使用的Create创建RequesBody)通过Builder构造RequestBody,叫做MultipartBuilder,一般用来用来上传表单(键值对) [1]
``//01.创建OkHttpClient对象.`` ``OkHttpClient mOkHttpClient=``new` `OkHttpClient();`` ``//02.通过new FormEncodingBuilder()调用build方法,创建一个RequestBody,可以用add添加键值对`` ``RequestBody requestBody = ``new` `FormEncodingBuilder() `` ``.add(``"YYY"``, ``"XXX"``)`` ``.add(``"version"``, ``"23"``) `` ``.build();`` ``注意:okhttp3.``0``以后就不能用采用FormEncodingBuilder的方式来创建表格,而是采用FormBody`` ``2``.通过``new` `FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 `` ``FormBody formBody = ``new` `FormBody.Builder() `` ``.add(``"XXX"``,易大师) `` ``.add(``"YYY"``,YCF) `` ``.build();`` ``//03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入 `` ``Request request = ``new` `Request.Builder() `` ``.url(``"http://XXX/易宸锋/YYY"``) `` ``.post(requestBody对象) `` ``.build();`` ``//04.创建一个call对象( 也可以省略的写为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});)`` ``Call call = mOkHttpClient.newCall(request对象); ``//05.请求加入调度(发送请求)`` ``call.enqueue(``new` `Callback()`` ``{ ``//请求失败执行的方法`` ``public` `void` `onFailure(Request request, IOException e){}`` ``//请求成功执行的方法,response就是从服务器得到的参数`` ``public` `void` `onResponse(``final` `Response response) ``throws` `IOException`` ``{`` ``//String htmlStr = response.body().string();`` ``}`` ``});
```java
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gohi.tools.R;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class testMainActivity extends AppCompatActivity {
private LinearLayoutManager linearLayoutManager;
private RecyclerView recyclerView;
private String url = "localhost:8080/BookShop/shopSer?keyword=1";
private List goodInfoList;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.xxx);
getData(url);
}
private void getData(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request. Builder().url(url).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Toast.makeText(testMainActivity.this,"连接失败了,请稍后再试!",Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if (response.isSuccessful()){
String result = response.body().string();
System.out.println("result="+result);
//处理UI需要切换到UI线程
goodInfoList = JsonUtil.json2ArrayList(result,GoodInfo.class);
if (goodInfoList != null){
runOnUiThread(new Runnable() {
@Override
public void run() {
linearLayoutManager = new LinearLayoutManager(testMainActivity.this);
//为recycleViews设定动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
//为recycleView添加分割线
recyclerView.addItemDecoration(new DividerItemDecoration(testMainActivity.this,DividerItemDecoration.VERTICAL));
//设置适配器
recyclerView.setAdapter(new GoodListAdapter(testMainActivity.this,goodInfoList));
}
});
}
}
}
});
}
}
:cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat:
## :pushpin:内容总结:
### :clock1030:本文介绍了okHTTP框架,还有:bug:没有写到本文内,后续内容可以继续追踪博主的后续文章,或许会介绍相关的内容,如果没介绍,请用力踢一脚,好让摸鱼的博主积极主动的去认识错误并及时改正,在发光发热的道路上越走越远……
表情网站:[🎁 Emoji cheat sheet for GitHub, Basecamp, Slack & more (webfx.com)](https://www.webfx.com/tools/emoji-cheat-sheet/)