Android网络操作

本文详细介绍了Android程序中的网络基础知识,包括HTTP和HTTPS协议的工作原理、Android网络权限设置、网络连接检查以及简单的网络请求实现。还提到了Android 9.0对HTTP请求的限制以及如何创建安全配置文件。同时,文章讲解了JSON数据交换格式及其解析方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络基础知识

http协议

1. Android 网络知识简介

Android程序最重要的模块就是网络部分,如何从网络上下载数据,如何将处理过的数据上传至网络,往往是android程序的关键环节...

2. Android 网络的使用场景

现在多半数是基于移动端的开发,那么这时候我们所开发的app就要不断的向服务器端发送请求,然后服务器端会根据相应的请求字段将相应的内容返回给app端,这时候返回给app端的是json格式的字符串,然后app端通过一定的json解析手段将一定的数据显示在对应的控件上,达到数据显示的效果。

3.什么是Http协议?

        HTTP协议即超文本传送协议(Hypertext Transfer Protocol),是Web联网的基础,也是手机联网常用的协议之一, HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。HTTP提供了封装或者显示数据的具体形式。Socket 提供了网络通信的能力

4.什么是Https协议?

        HTTPS (全称: Hypertext Transfer Protocol over Secure Socket Layer ),是以安全为目标的HTTP通道简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.它是一 个URI scheme (抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL 表明它使用了HTTP但HTTssPS存在不同于HTTP的默认端口及-一个加密/身份验证层(在HTTP与TCP之间)被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

5. Android中网络权限:

<uses- permission 

        android:name =" android.permission.INTERNET />

        <--允许应用程序打开网络套接字-->

<uses-permission 

        android:name="android.permission.ACCESS_ NETWORK STATE*/>

        <--允许应用程序访问网络连接信息-->

6.检查网络连接

在执行网络操作之前,检查设备当前连接的网络连接信息是个好习惯。这样可以防止我们的程序在无意间连接使用了非意向的网络频道。如果网络连接不可用,那么我们的应用应该优雅地做出响应。为了检测网络连接,我们需要使用到下面两个类:
1) ConnectivityManager :它会回答关于网络连接的查询结果,并在网络连接改变时通知应用程序。
2) NetworkInfo :描述一 个给定类型(移动网络或Wi-Fi等)的网络接口状态。下面这个方法可以找到的第一个已连接的网络接口,如果返回null ,则表示没有已连接的网络接口(意味着网络连接不可用) :

网络请求

网络请求方式

 从服务器获取数据

        1、实例化一个URL对象

        2、获取HttpURLConnection对象

        3、设置请求连接属性

        4、获取响应码,判断连接结果码

        5、读取输入流并解析

GET  VS  POST

代码演示get请求

package com.example.mdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class NetworkActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mTextView;
    private Button mButton;
    private Button mParseDataButton;
    private static final String TAG = "NetworkActivity";
    private String mResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_network);

        findViews();
        setListeners();
    }

    private void findViews(){
        mTextView = findViewById(R.id.textView);
        mButton = findViewById(R.id.getButton);
        mParseDataButton = findViewById(R.id.parseDataButton);
    }

    private void setListeners(){
        mButton.setOnClickListener(this);
        mParseDataButton.setOnClickListener(this);
    }

    public void onClick(View v){
        switch (v.getId()){
            case R.id.getButton:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            URL url = new URL("http://www.imooc.com/api/teacher?type=2&page=1");
                            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                            connection.setConnectTimeout(30*1000);
                            connection.setRequestMethod("GET");
                            connection.setRequestProperty("Content-Type","application/json");
                            connection.setRequestProperty("Charset","UTF-8");
                            connection.setRequestProperty("Accept-Charset","UTF-8");
                            connection.connect();//发起连接

                            int responseCode = connection.getResponseCode();//获取请求码
                            String responseMessage = connection.getResponseMessage();//获取返回的消息

                            if (responseCode == HttpURLConnection.HTTP_OK){
                                InputStream inputStream = connection.getInputStream();
                                mResult = streamToString(inputStream);

                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        mResult = decode(mResult);
                                        mTextView.setText(mResult);
                                    }
                                });

//                                mTextView.post(new Runnable() {
//                                    @Override
//                                    public void run() {
//
//                                    }
//                                });

                            } else {
                                //TODO: error fail

                                Log.e(TAG,"run: error code:" + responseCode + ",message:" + responseMessage);
                            }

                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
                break;
            case R.id.parseDataButton:

                break;
        }
    }

    /**
     * 将输入流转换成字符串
     *
     * @param is 从网络获取的输入流
     * @return 字符串
     */
    public String streamToString(InputStream is) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            baos.close();
            is.close();
            byte[] byteArray = baos.toByteArray();
            return new String(byteArray);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            return null;
        }
    }

    /**
     * 将Unicode字符转换为UTF-8类型字符串
     */
    public static String decode(String unicodeStr) {
        if (unicodeStr == null) {
            return null;
        }
        StringBuilder retBuf = new StringBuilder();
        int maxLoop = unicodeStr.length();
        for (int i = 0; i < maxLoop; i++) {
            if (unicodeStr.charAt(i) == '\\') {
                if ((i < maxLoop - 5)
                        && ((unicodeStr.charAt(i + 1) == 'u') || (unicodeStr
                        .charAt(i + 1) == 'U')))
                    try {
                        retBuf.append((char) Integer.parseInt(unicodeStr.substring(i + 2, i + 6), 16));
                        i += 5;
                    } catch (NumberFormatException localNumberFormatException) {
                        retBuf.append(unicodeStr.charAt(i));
                    }
                else {
                    retBuf.append(unicodeStr.charAt(i));
                }
            } else {
                retBuf.append(unicodeStr.charAt(i));
            }
        }
        return retBuf.toString();
    }


}

9.0新特性

1、9.0对http请求的限制

2、创建安全配置文件

        ①在res文件夹下创建xml/network-security-config文件

        ②增加cleartextTrafficPermitted属性

3、添加安全配置文件

        ①AndroidManifest.xml中的Application申明

        ②增加cleartextTrafficPermitted属性

数据解析

一、什么是JSON?
        一种轻 量级的数据交换格式,具有良好的可读和便于快速编写的特性。 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, 获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

二、Json 格式:



三、使用json解析图2的Json字符串:

        JSON数据般由服务器端提供接口,我们根据接口地址解析数据,最终将数据显示在APP上的过程,以图2为例来演示json数据解析。

 

private void parseJsonMulti(String strResult){
        try{
            JSONArray jsonObjs = new JSONObject(strResult).getJSONArray("singers");
            String s = "";
            for(int i = 0;i <jsonObjs.length();i ++){
                JSONObject jsonObj = (JSONObject) jsonObjs.get(i);
                int id = jsonObj.getInt("id");
                String name = jsonObj.getString("name");
                String gender = jsonObj.getString("gender");
                s += "ID号"+id+",姓名:"+name+",性别:"+gender+"\n";
            }
            tvJson.setText(s);
        }catch (JSONException e){
            System.out.println("Jsons parse error!");
            e.printStackTrace();
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值