OkHttp访问服务器中的xml资源

首先,添加OkHttp依赖

  implementation 'com.squareup.okhttp3:okhttp:3.14.2'

因为静态接口需要Java8才能支持使用,我们要使用静态接口,需要在build.gradle文件中添加如下配置声明,使用Java8编译

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

不然会出现如下异常:

错误一:

   Static interface methods are only supported starting with Android N (--min-api 24): java.util.List okhttp3.Dns.lambda$static$0(java.lang.String)
  Message{kind=ERROR, text=Static interface methods are only supported starting with Android N (--min-api 24): 
java.util.List okhttp3.Dns.lambda$static$0(java.lang.String),sources=[Unknown source file], tool name=Optional.of(D8)}

错误二:

   Invoke-customs are only supported starting with Android O (--min-api 26)
   Message{kind=ERROR, text=Invoke-customs are only supported starting with Android O (--min-api 26), sources=[Unknown source file], tool name=Optional.of(D8)}

在AndroidManifest.xml中添加网络访问权限

    <uses-permission android:name="android.permission.INTERNET" />

创建工具类:

 1 public class OkHttpTools {
 2     //创建OkHttpClient对象
 3     private final OkHttpClient client = new OkHttpClient();
 4     //获取章节信息的方法
 5     public String getDate(String url){
 6         //构建请求
 7         Request request = new Request.Builder()
 8                 .url(url)
 9                 .build();
10         //获取Response对象
11         try (Response response = client.newCall(request).execute()) {
12             //响应成功并返回响应内容
13             if (response.isSuccessful()) {
14                 return response.body().string();
15                 //此时代码执行在子线程,修改UI的操作使用handler跳转到UI线程
16             }
17         }catch (Exception e){
18             e.printStackTrace();
19         }
20         return " ";
21     }
22 }

Activity:在子线程中获取访问的数据,并把解析的数据通过Handler添加到适配器中

子线程:

 1         new Thread(){
 2             @Override
 3             public void run() {
 4                 OkHttpTools tools = new OkHttpTools();
 5                 String s = tools.getDate("http://192.168.*.*:8080/resource/chapter"+id+".xml");
 6                 if (s!=null){
 7                     //s.getBytes()返回的是字节数组
 8                    initData(new ByteArrayInputStream(s.getBytes()));
 9                    handler.sendEmptyMessage(MSG_OK);
10                 }
11             }
12         }.start();                                

initData()方法:接收流对象并进行解析数据

1     private void initData(InputStream is) {
2         try {
3             //获取解析xml的数据
4             ebl = AnalysisUtils.getExercisesInfos(is);
5         } catch (Exception e) {
6             e.printStackTrace();
7         }
8     }

Handler:进行数据的处理

 1      Handler handler = new Handler(){
 2          @Override
 3          public void handleMessage(Message msg) {
 4              if (msg.what== MSG_OK){
 5                  //将解析的数据添加到适配器
 6                  adapter.setData(ebl);
 7                  //刷新数据
 8                  adapter.notifyDataSetChanged();
 9              }
10          }
11      };

猜你喜欢

转载自www.cnblogs.com/chaunceyji/p/10940041.html