赞
踩
一些友友们写 安卓的时候,都会 用到网络请求,有时候一个java文件就需要用到多次,每次请求的代码重复型较高,就可以考虑到将请求代码封装起来,下面是请求代码,亲测有效!效果俱佳!
1. ·创建一个空白的java类,编写下段代码:
- import java.io.IOException;
- import okhttp3.Call;
- import okhttp3.Callback;
- import okhttp3.OkHttpClient;
- import okhttp3.Request;
- import okhttp3.Response;
-
- public class MyOkhttp {
-
- private String ResponseData = null;
- private boolean aBoolean = false;
-
- public String sendRequest(Request request)
- {
- OkHttpClient client = new OkHttpClient();
- Call call = client.newCall(request);
- call.enqueue(new Callback() {
- @Override
- public void onFailure(Call call, IOException e) {
- // 网络请求失败
- }
-
- @Override
- public void onResponse(Call call, Response response) throws IOException {
- // 网络请求成功
- String data = response.body().string();
- ResponseData = data;
- aBoolean = true; // 因为这种写法是异步请求,所以需要判断一下是否取到数据
- }
- });
- // 加个循环卡住当前线程,直到取到数据
- while (true)
- {
- if (aBoolean)
- return ResponseData; // 返回数据
- else
- {
- // 没加这段代码前,总是会有取不到数据,看代码都没有发现毛病,加上这个后就可以了,迷,估计是一些小毛病吧,速度太快给个缓冲,不影响效率。
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
- }
- }
2. 调用部分:
【注意:在Android4.0以后,在主线程中的HTTP请求,运行时都会报错 ANRs(“Application Not Responding”),”应用没有响应“。所以需要进行网络请求的时候 还是需要开辟一个子线程,然后等到数据返回成功后再切换为主线程来刷新UI。】
- new Thread(()->{ //加个子线程
- MyOkhttp myOkhttp = new MyOkhttp(); // 创建上面的封装对象
- Request request = new Request.Builder()
- .url("网络地址")
- .build();
- String data = myOkhttp.sendRequest(request); // 获取相应数据
- ......//加下来就是对获取到的数据解析了,注意,对UI进行更改需要切换为主线程,不然会报错。我诺列两种方法切换主线程:
-
- 1.
- runOnUiThread(()->{
- // UI更改代码
- });
-
-
- 2.
- 写一个全局变量:private Handler handler = new Handler();
- 然后: handler.post(()->{
- // UI更改代码
- });
-
- }).start();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。