zoukankan      html  css  js  c++  java
  • 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      };
  • 相关阅读:
    Vue+ElementUI 安装与应用
    python 之serial、pyusb 使用开发
    ASP.NET Swagger 创建与汉化生成 API说明文档
    DataGridView绑定数据源后动态删除行
    MySql动态拼接SQL并动态赋值
    MySql存储过程
    DEV控件之TreeList使用
    DataGridView单元格格式化
    ajax通过PUT方式调用WEBAPI
    解决跨域session 同步问题
  • 原文地址:https://www.cnblogs.com/chaunceyji/p/10940041.html
Copyright © 2011-2022 走看看