【第一行代码】NetWorkTest

简介

利用 HttpURLConnection,对网络服务器进行简单的 GET 和 POST

利用 OKHttp,对网络服务器进行简单的 GET 和 POST

利用 PULL 和 SAX 对 xml 进行解析

利用 JOSNObject 和 GSON 对 JSON 进行解析

将 HttpURLConnection 和 OKHttp 分离出来,学习使用 java 的回调机制

网络服务器交互

HttpURLConnection

HttpClient 在 Android6.0 系统中被完全移除,官方建议使用 HttpURLConnection。

在使用之前需要声明网络权限,在 AndroidManifest.xml 添加 <uses-permission android:name="android.permission.INTERNET"/>

private void sendRequestWithHttpURLConnection() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            HttpURLConnection connection =null;
            BufferedReader reader = null;
            try {
                URL url = new URL("https://www.baidu.com");
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(8000);//连接超时
                connection.setReadTimeout(8000);//读取超时
//              提交数据到服务器
//              connection.setRequestMethod("POST");
//              DataOutputStream out = new DataOutputStream(connection.getOutputStream());
//              out.writeBytes("username=admin&password=123456");

                InputStream in = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                showResponse(response.toString());
            }catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(reader != null) {
                    try {
                        reader.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
                if(connection != null) {
                    connection.disconnect();
                }
            }
        }
    }).start();
}

OKHttp

OKHttp 是一个开源的网络通信库,接口封装的简单易用,底层实现自成一派。

在 build.gradle 添加依赖 implementation 'com.squareup.okhttp3:okhttp:3.4.1'

private void sendRequestWithOKHttp() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                //GET 方法
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .build();
                Response response = client.newCall(request).execute();
                String responseData = response.body().string();
                showResponse(responseData);

                //POST 方法
                /*
                RequestBody requestBody = new FormBody.Builder()
                        .add("username", "admin")
                        .add("password", "123456")
                        .build();
                Request request1 = new Request.Builder()
                        .url("https://www.baidu.com")
                        .post(requestBody)
                        .build();
                Response response1 = client.newCall(request).execute();
                */
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

传输数据常用格式

解析 xml

假设需要解析的 xml 文本为

<apps>
    <app>
        <id>1</id>
        <name>Google Maps</name>
        <version>1.0</version>
    </app>
    <app>
        <id>2</id>
        <name>Chrome</name>
        <version>2.1</version>
    </app>
    <app>
        <id>3</id>
        <name>Google Play</name>
        <version>2.3</version>
    </app>
</apps>

将 test.xml 放到 main/assets 目录下面,通过下面的方法获取其内容

String result = null;
try {
    InputStream is = getAssets().open("test.xml");
    int length = is.available();
    byte[]  buffer = new byte[length];
    is.read(buffer);
    result =  new String(buffer, "utf8");
} catch (IOException e) {
    e.printStackTrace();
}

利用 Pull 解析

private void parseXMLWithPull(String xmlData) {
    Log.d(TAG, "parseXMLWithPull() called with: xmlData = [" + xmlData + "]");
    StringBuilder res = new StringBuilder();
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xmlPullParser = factory.newPullParser();
        xmlPullParser.setInput(new StringReader(xmlData));
        int eventType = xmlPullParser.getEventType();
        String id = "";
        String name = "";
        String version = "";
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String nodeName = xmlPullParser.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if("id".equals(nodeName)) {
                        id = xmlPullParser.nextText();
                    }else if("name".equals(nodeName)) {
                        name = xmlPullParser.nextText();
                    }else if("version".equals(nodeName)) {
                        version = xmlPullParser.nextText();
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if("app".equals(nodeName)) {
                        Log.d(TAG, "parseXMLWithPull: " + id);
                        String item = id + name + version + "\n";
                        res.append(item);
                    }
                    break;
                default:break;
            }
            eventType = xmlPullParser.next();
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
    showResponse(res.toString());
}

利用 XAS 解析

public class ContentHandler extends DefaultHandler {

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;
    private StringBuilder result;
    private SAXListener mListener;

    public ContentHandler(SAXListener listener) {
        super();
        mListener = listener;
    }

    //XML的SAX解析方式
    //在开始XML解析的时候调用
    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
        result = new StringBuilder();
    }

    //解析某个节点的时候调用
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //记录当前节点名
        nodeName = localName;
    }

    //获取节点内容的时候调用
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //根据当前节点判断将内容添加到哪一个StringBuilder中
        if("id".equals(nodeName)) {
            id.append(ch, start, length);
        }else if("name".equals(nodeName)) {
            name.append(ch, start, length);
        }else if("version".equals(nodeName)) {
            version.append(ch, start, length);
        }
    }

    //完成解析某个节点的时候调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if("app".equals(localName)) {
            //需要去除两端空格
            result.append(id.toString().trim());
            result.append(name.toString().trim());
            result.append(version.toString().trim());
            result.append("\n");
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    //完成整个XML解析的时候调用
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        mListener.onEndDocument(result.toString());
    }

    public interface SAXListener {
        void onEndDocument(String res);
    }
}

private void parseXMLWithSAX(String xmlData) {
    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader xmlReader = factory.newSAXParser().getXMLReader();
        ContentHandler handler = new ContentHandler(new ContentHandler.SAXListener() {
            @Override
            public void onEndDocument(String res) {
                showResponse(res);
            }
        });
        xmlReader.setContentHandler(handler);
        xmlReader.parse(new InputSource(new StringReader(xmlData)));
    }catch (Exception e) {
        e.printStackTrace();
    }
}

解析 json

假设需要 json 为

[
  {
    "id" : "5",
    "version" : "5.5",
    "name" : "Clash of Clans"
  },
  {
    "id" : "6",
    "version" : "7.0",
    "name" : "Boom Beach"
  },
  {
    "id" : "7",
    "version" : "3.5",
    "name" : "Clash Royale"
  }
]

一样的操作,将文件放到 assets 目录下。

利用 JOSNObject 解析

private void parseJSONWithJSONObject(String jsonData) {
    try {
        JSONArray jsonArray = new JSONArray(jsonData);
        StringBuilder res = new StringBuilder();
        for(int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String id = jsonObject.getString("id");
            String version = jsonObject.getString("version");
            String name = jsonObject.getString("name");
            res.append(id);
            res.append(version);
            res.append(name);
            res.append("\n");
        }
        showResponse(res.toString());
    }catch (Exception e) {
        e.printStackTrace();
    }
}

利用 GSON 解析

首先在 build.gradle 添加依赖 implementation 'com.google.code.gson:gson:2.7'

GSON 主要是将一段 Json 格式的字符串自动映射成一个对象。

public class App {
    //使用GSON对JOSN解析
    private String id;
    private String version;
    private String name;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "App{" +
                "id='" + id + '\'' +
                ", version='" + version + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

private void parseJSONWithGSON(String jsonData) {
    Gson gson = new Gson();
    List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>()
    {}.getType());
    StringBuilder res = new StringBuilder();
    for(App app : appList) {
        res.append(app);
        res.append("\n");
    }
    showResponse(res.toString());
}

项目源码下载

Github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值