Android开发-网络操作

本文深入讲解Android中网络使用的常见场景,包括HTTP与HTTPS协议的区别,如何在Android中申请网络权限,检查网络连接状态,以及如何使用GET和POST请求从服务器获取数据。同时,文章还详细介绍了如何解析JSON数据,包括原生解析方式和第三方框架的使用。

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

目录

1.Android网络使用场景

2.什么是Http协议

3.什么是Https协议

4.Android的网络权限

5.检查网络连接

6.从服务器获取数据

7.GET请求

8.POST请求

9.GET与POST的区别

10.JSON解析

10.1 原生方式解析JSON


 


1.Android网络使用场景

     App发送请求到服务端,服务端返回给APP端的是json格式的字符串,然后APP通过解析json来获取数据。

2.什么是Http协议

     Http协议即超文本传输协议(Hypertext Transfer Protocol),是Web联网的基础,也是手机联网常用的协议之一。Http协议是建立在TCP协议之上的一种应用。Http连接最显著的特点是客户端发送的每次请求,都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为一次连接。

     Http提供了封装或者显示数据的具体形式,Socket提供了网络通信的能力。

3.什么是Https协议

      HTTPS(Hypertext Transfer Protocol Over Secure Socket Layer),即安全套接字层上的超文本传输协议,是以安全为目标的Http通道。简单来讲就是Http的安全版。即Http下加入了SSL层。

      HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的Http数据传输。

       https:URL表明它使用了Http,但是HTTPS不同与http,它的默认端口及一个加密/身份验证层(在Http与TCP之间)。被广泛应用于万维网上安全敏感的通讯,例如支付交易方面。

4.Android的网络权限

<!-- 允许应用程序打开网络套接字 -->
<users-permission android:name="android.permission.INTERNET"/>
<!-- 允许应用程序访问网络连接信息 -->
<users-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

 

5.检查网络连接

      在执行网络操作之前,检查设备当前连接的网络连接信息是个好习惯。这样可以防止我们的程序在无意间连接使用了非意向的网络频道。如果网络连接不可用,那么我们的应用应该优雅地做出响应。为了检测网络连接,我们需要使用下面两个类:

ConnectivityManager

它会回答关于网络连接的查询结果,并在网络连接改变时,

通知应用程序

NetworkInfo描述一个给定类型(移动网络或者WIFI)的网络接口状态。

       下面这个方法可以找到的第一个已连接的网络接口,如果返回null,则表示没有已连接的网络接口(意味着网络连接不可用)。

public boolean isOnline(){
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = manager.getActiveNetworkInfo();
    return (info != null && info.isConnected());
}

 

6.从服务器获取数据

        步骤如下:

1.实例化一个URL对象。
2.获取HttpURLConnection对象(这是自带的原生,以后会用第三方的)。
3.设置请求连接属性。
4.获取响应码,判断连接结果码。
5.读取输入流并解析。

 

7.GET请求

      注意:主线程和子线程

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.getData:
            //主线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                   requestDataByGet();
               }
           }).start();  //注意别忘了start()
           break;
        }
    }
}
//get方式请求数据
private void requestDataByGet() {
    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();
            //输入流转换成字符串
            result = StreamUtil.streamToString(inputStream);
            //将Unicode字符转换为UTF-8类型的字符
            result = StreamUtil.decode(result);
            //开启子线程
            runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
                     textView.setText(result);
                 }
            });
        }else{
             Log.e(TAG,"run:error code"+responseCode+",errorMessage:"+responseMessage);
        }
     } catch (Exception e) {
        e.printStackTrace();
     }
}

         另外一种读取方法:

if(requestCode == HttpURLConnection.HTTP_OK){
    InputStreamReader inputStreamReader = new       InputStreamReader(connection.getInputStream());
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    StringBuilder builder = new StringBuilder();
    String line;
    while ((line = bufferedReader.readLine()) != null){
        builder.append(line)
    }
    return builder.toString();
}

 

8.POST请求

       将请求的参数独立封装,再传输出去。

 //post方式请求数据
    private void requestDataByPost() {
        try {
            URL url = new URL("http://www.imooc.com/api/teacher");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(30*1000);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type","application/json");
            connection.setRequestProperty("Charset","UTF-8");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestProperty("Accept-Charset","UTF-8");
            //设置不缓存
            connection.setUseCaches(false);
            connection.connect();
            //设置参数
            String data = "username="+getEncodeValue("imooc")+"&number="+getEncodeValue("123456");
            OutputStream outputStream = connection.getOutputStream();
            //写入参数
            outputStream.write(data.getBytes());
            outputStream.flush();
            outputStream.close();
            int responseCode = connection.getResponseCode();
            String responseMessage = connection.getResponseMessage();
            if(responseCode == HttpURLConnection.HTTP_OK){
                InputStream inputStream = connection.getInputStream();
                //输入流转换成字符串
                result = StreamUtil.streamToString(inputStream);
                //将Unicode字符转换为UTF-8类型的字符
                result = StreamUtil.decode(result);
                //开启子线程
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(result);
                    }
                });
            }else{
                Log.e(TAG,"run:error code"+responseCode+",errorMessage:"+responseMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //将字符串编码设置为UTF-8
    public String getEncodeValue(String str){
        String encode = null;
        try {
            encode = URLEncoder.encode(str,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return encode;
    }

 

9.GET与POST的区别

    区别如下:

协议用法安全(传输)安全(本质上)冥等性可缓存
TCP获取数据X
UDP提交数据XXX

 

10.JSON解析

JSONObject指的是Json对象
JSONArray指的是Json数组

    

10.1 原生方式解析JSON

      JSON数据如下:

{
status: 1,
data: [
    {
        id: 1,
        name: "Tony老师聊shell——环境变量配置文件",
        picSmall: "http://img.mukewang.com/55237dcc0001128c06000338-300-170.jpg",
        picBig: "http://img.mukewang.com/55237dcc0001128c06000338.jpg",
        description: "为你带来shell中的环境变量配置文件",
        learner: 12312
    },
    {
        id: 2,
        name: "数学知识在CSS动画中的应用",
        picSmall: "http://img.mukewang.com/55249cf30001ae8a06000338-300-170.jpg",
        picBig: "http://img.mukewang.com/55249cf30001ae8a06000338.jpg",
        description: "数学知识与CSS结合实现酷炫效果",
        learner: 45625
    },
    {
        id: 3,
        name: "Oracle数据库开发必备利器之PL/SQL基础",
        picSmall: "http://img.mukewang.com/5523711700016d1606000338-300-170.jpg",
        picBig: "http://img.mukewang.com/5523711700016d1606000338.jpg",
        description: "Oracle数据库高级开发必备的基础。",
        learner: 41236
    },
      ],
msg: "成功"
}

  步骤1:定义对应的实体类

//Lesson实体类
public class Lesson {
    private int id;
    private int learnerNumber;
    private String name;
    private String smallPictureUrl;
    private String bigPictureUrl;
    private String description;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getLearnerNumber() {
        return learnerNumber;
    }
    public void setLearnerNumber(int learnerNumber) {
        this.learnerNumber = learnerNumber;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSmallPictureUrl() {
        return smallPictureUrl;
    }
    public void setSmallPictureUrl(String smallPictureUrl) {
        this.smallPictureUrl = smallPictureUrl;
    }
    public String getBigPictureUrl() {
        return bigPictureUrl;
    }
    public void setBigPictureUrl(String bigPictureUrl) {
        this.bigPictureUrl = bigPictureUrl;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public String toString() {
        return "Lesson{" +
                "id=" + id +
                ", learnerNumber=" + learnerNumber +
                ", name='" + name + '\'' +
                ", smallPictureUrl='" + smallPictureUrl + '\'' +
                ", bigPictureUrl='" + bigPictureUrl + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

  

//查询的结果集实体类
public class LessonResult {
    private int status;
    List<Lesson> lessonsList;
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public List<Lesson> getLessons() {
        return lessonsList;
    }
    public void setLessons(List<Lesson> lessonsList) {
        this.lessonsList = lessonsList;
    }
    @Override
    public String toString() {
        return "LessonResult{" +
                "status=" + status +
                ", lessonsList=" + lessonsList +
                '}';
    }
}

    步骤二:解析JSON数据

 //处理解析Json数据
    private void handleJSONData(String result) {
        try {
            LessonResult lessonResult = new LessonResult();
            List<Lesson> lessonList = new ArrayList<Lesson>();
            JSONObject jsonObject = new JSONObject(result);
            int status = jsonObject.getInt("status");
            lessonResult.setStatus(status);
            JSONArray jsonArray = jsonObject.getJSONArray("data");
            if(jsonArray != null && jsonArray.length() != 0){
                for (int i = 0;i<jsonArray.length();i++){
                    JSONObject lessonObject = (JSONObject) jsonArray.get(i);
                    int id = lessonObject.getInt("id");
                    int learner = lessonObject.getInt("learner");
                    String name = lessonObject.getString("name");
                    String smallPicture = lessonObject.getString("picSmall");
                    String bigPicture = lessonObject.getString("picBig");
                    String description = lessonObject.getString("description");
                    Lesson lesson = new Lesson();
                    lesson.setId(id);
                    lesson.setName(name);
                    lesson.setSmallPictureUrl(smallPicture);
                    lesson.setBigPictureUrl(bigPicture);
                    lesson.setDescription(description);
                    lessonList.add(lesson);
                }
                lessonResult.setLessons(lessonList);
            }     
            textView.setText(lessonResult.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

 

10.2 第三方框架解析方式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值