目录

  • 一、网络访问概述
  • 二、通过Http访问数据
  • 三、网络获取多个值的方法

一、网络访问概述

先来讲解和回顾一下,我们之前学了Andriod的ui,各种布局和控件,实际上,我们以后工作的时候,这个ui是不需要我们来设计的,会有设计师给我们设计好ui,然后我们再xml文件把ui用代码的形式把他还原 出来,例如下图,是我们qq里的资料卡界面,我们设计好UI之后,我这里拿文本控件举例子,里面的文本数据可以先随便用一串数字(假数据),表示那是一个控件,里面的文本数据可以通过activity来设置,但是我们知道,我们用的所有app,针对不同用户的很多数据都是不同的,那么我们怎么获取这个数据呢?我们可以通过发送请求,到服务器获取数据,服务器则是通过到数据库查询然后返回数据给安卓。

在进行网络编程之前,我们需要做的准备工作

开启网络访问权限

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

http请求数据一般不加密
https一般是加密的
Https访问比Http安全,所以android默认只允许我们使用Https协议,如有需要可以开启http访问权限。

android:usesCleartextTraffic="true"

二、通过Http访问数据

1.MainActivity.java核心代码:

try {URL url=new URL("http://148.70.46.9/user");//获取服务器地址HttpURLConnection urlConnection= (HttpURLConnection) url.openConnection();//双方建立连接urlConnection.setRequestMethod("GET");//给服务器发送请求//服务器返回的数据 我们需要返回的是文本   所以返回的数据默认是字节流InputStream inputStream=urlConnection.getInputStream(); //字节流Reader reader=new InputStreamReader(inputStream); //把字节流转化成字符流BufferedReader bufferedReader=new BufferedReader(reader);//字符流 转成 缓冲流,一次可以读一行String result = "";String temp;while ((temp=bufferedReader.readLine())!=null){//当temp读到的数据为空就结束result += temp;Log.i("Main","result :"+result);}inputStream.close();reader.close();bufferedReader.close();//todo 关闭流} catch (Exception e) {e.printStackTrace();}


2.运行之后发现会报错android.os.NetworkOnMainThreadException

这个错误说明网络在 主线程异常。 网络访问不能在主线程。

所以我们需要创建一个线程。
3.创建线程
方法一 通过继承thread
代码:

(匿名类)Thread thread = new Thread(){//方法1@Overridepublic void run() {super.run();//子线程}};thread.start();
-------------------------------------------------------
(重写方法)class MyThread extends Thread {@Overridepublic void run() {//子线程}};MyThread myThread = new MyThread();myThread.start();

方法二 通过实现Runnable接口
代码:

(匿名类)Thread thread1 = new Thread(new Runnable() {//方法2@Overridepublic void run() {//子线程}});thread1.start();
------------------------------------------------
(重写方法)class Hello implements Runnable {@Overridepublic void run() {//子线程}};Thread thread = new Thread(new Hello());thread.start();

将发送请求,接收服务器数据代码放到子线程中

4.最终代码:

package com.hnucm.a_test10;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Thread thread = new Thread(){//方法1@Overridepublic void run() {super.run();//子线程try {URL url=new URL("http://148.70.46.9/user");//获取服务器地址HttpURLConnection urlConnection= (HttpURLConnection) url.openConnection();//双方建立连接urlConnection.setRequestMethod("GET");//给服务器发送请求//服务器返回的数据 我们需要返回的是文本   所以返回的数据默认是字节流InputStream inputStream=urlConnection.getInputStream(); //字节流Reader reader=new InputStreamReader(inputStream); //把字节流转化成字符流BufferedReader bufferedReader=new BufferedReader(reader);//字符流 转成 缓冲流,一次可以读一行String result = "";String temp;while ((temp=bufferedReader.readLine())!=null){//当temp读到的数据为空就结束result += temp;Log.i("Main","result :"+result);}inputStream.close();reader.close();bufferedReader.close();//todo 关闭流} catch (Exception e) {e.printStackTrace();}}};thread.start();}
}

5.获取TextView控件,将结果赋值


因为在android中UI 操作 ,控件设置属性,点击事件 ,不能在子线程执行,只能在主线程执行

所以修改以上代码

最终代码:


package com.hnucm.a_test10;import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import org.json.JSONObject;import java.awt.font.TextAttribute;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.*;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView=findViewById(R.id.tv);textView.setText("初始化");Thread thread = new Thread(){//方法1@Overridepublic void run() {super.run();//子线程try {//    URL url=new URL("http://www.baidu.com");//这访问的是域名URL url=new URL("https://www.fastmock.site/mock/2af8e2ac7371144c506cf0390b19e6c2/test/test01");//获取服务器哦地址HttpURLConnection urlConnection= (HttpURLConnection) url.openConnection();//双方建立连接urlConnection.setRequestMethod("GET");//给服务器发送请求//服务器返回的数据 我们需要返回的是文本   所以返回的数据默认是字节流InputStream inputStream=urlConnection.getInputStream(); //字节流Reader reader=new InputStreamReader(inputStream); //把字节流转化成字符流BufferedReader bufferedReader=new BufferedReader(reader);//字符流 转成 缓冲流,一次可以读一行String result="";//初始化String temp;while ((temp=bufferedReader.readLine())!=null) {//当temp读到的数据为空就结束result += temp;//把temp拼接起来}Log.i("Main","result :"+result);String finalResult=result;Thread.sleep(2000);//模拟网络请求时间比较长runOnUiThread(new Runnable() {@Overridepublic void run() {try {JSONObject jsonObject=new JSONObject(finalResult);String s=jsonObject.getString("name");textView.setText(s);} catch (Exception e) {e.printStackTrace();}}});inputStream.close();reader.close();bufferedReader.close();//todo 关闭流} catch (Exception e) {e.printStackTrace();}}};thread.start();}
}

演示:

三、网络获取多个值的方法

方法一:对字符串进行切割

可以对要接收的数据中加上一些无关字符方便切割
例如 :
test今天是test星期二test天气晴
通过 split(“test”)方法切割字符串
但是这种方法弊端很大,不方便,而且如果字段中包含test那么将切割错误

方法二:xml结构

会根据
<>text</>这种结构解析得到字段名

通过解析xml来获取值,但是这种方法现在也用得少了

方法三:通过json解析
例如上面的例子用json来表示:
“今天是”“星期二”“天气晴”

json 解析比xml结构最大的优势是: json 数据结构比xml要短,所以返回的整体字段越短,那么我们传输所消耗的流量也就也就越少,还有一个原因就是json更加简单

Android-第九节网络编程相关推荐

  1. Android中的网络编程-黄俊东-专题视频课程

    Android中的网络编程-1902人已学习 课程介绍         剔除繁杂的理论,注重实践,深入浅出讲解Android中的网络编程 课程收益     每一个学员都能系统地掌握Android中的网 ...

  2. Java基础 - 第九章 - 网络编程

    网络编程 一.IP和端口号 一.网络编程中有两个主要的问题:1.如何准确地定位网络上一台或多台主机:定位主机上的特定的应用2.找到主机后如何可靠高效地进行数据传输二.网络编程中的两个要素:1.对应问题 ...

  3. Android之Http网络编程(四)

    前面几篇博文简单的介绍了一些常见的Http的操作,这些操作几乎都是在新开的线程中进行的网络请求,并在日志中打印出获取到的网络数据.那么,问题来了!(呃~感觉下一句是蓝翔有木有?)如何在把获取到的网络数 ...

  4. Android中的网络编程

    谷歌在Android6.0之后就废弃了使用HttpClinet进行网络连接.所以,这里需要重点学习的是通过HttpUrlConnect进行网络连接. String path="这里是你想要的 ...

  5. Linux - 第12节 - 网络编程套接字(一)

    目录 1.预备知识 1.1.理解源IP地址和目的IP地址 1.2.理解源MAC地址和目的MAC地址 1.3.理解源端口号和目的端口号 1.4.理解端口号(PROT)和进程ID(PID) 1.5.认识T ...

  6. Android网络编程

    Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).下面分别介绍这些接口的功 ...

  7. 【Android】Android网络编程概述

    Android网络编程概述 原文来自:http://blog.csdn.net/kieven2008/article/details/8210737 首先,应该了解的几个问题: 1)Android平台 ...

  8. :Android网络编程--XML之解析方式:SAX

    任何放置在资源(res)目录下的内容可以通过应用程序的R类访问,这是被Android编译过的,而任何放置在资产(assets)目录下的内容会保持它的原始文件格式,为了读取它们,必须使用AssetMan ...

  9. Android网络编程常用的三种方法

    最近看了看以前的代码,发现很多东西不看不写慢慢忘记了,所以想总结下,首先想到的就是android下的网络编程.慢慢总结,慢慢完善. 首先android常用的有三种网络通信方式,socket编程.Htt ...

最新文章

  1. 开发详细设计文档_郑州APP开发:开发前,进行详细设计有没有必要?
  2. .NET开发Windows Service程序 - Topshelf
  3. 数据结构---BF字符串模式匹配
  4. 计算机无法同步时间,为什么在Win7中无法同步计算机时间?
  5. python函数chr_python函数之chr(i)
  6. 《node.js开发指南》读后感
  7. Android_(服务)Vibrator振动器
  8. 1458: 移动距离(暴力模拟)
  9. Jdk1.6.0+Tomcat6.0环境变量配置
  10. instantclient_11_2远程连接Oracle安装,绝对清晰易懂
  11. SiamRPN代码分析:test
  12. 临床数据共享能带来什么好处?
  13. POI导出word表格 office打开没问题 wps打开列有问题
  14. 一种设计软件界面的万能HTML标签
  15. 定义一个电话簿,用人名查电话
  16. 如何改变视频的MD5值?一分钟让你学会操作
  17. lisp一键室内标注_[AutoCAD][AutoLisp]根据图框自动匹配标注比例、文字大小、线性比例等信息 | 古意人...
  18. Nautre综述:鸟枪法宏基因组-从取样到数据分析(1)2万字带你系统入门宏基因组实验和分析...
  19. shell脚本(linux)
  20. 问题: return unicode(text, encoding, errors=errors) UnicodeDecodeError: ‘utf-8‘ codec can‘t decode

热门文章

  1. 利用excel批量操作MySql数据库
  2. Socks5代理IP技术详解:如何选择和使用最佳IP代理服务
  3. Redis安装与使用
  4. Win8安装教程!笔记本用U盘安装Win8只需三步
  5. 树莓派实验室python人脸识别_在树莓派上实现人脸识别
  6. Android 获取通讯录数据
  7. HUAWEI交换机的Hybrid接口(混杂模式)详解与实验配置演示
  8. PHP接口的概念与接口的应用场景
  9. C专家编程--随记(一)
  10. Allegro174版本新功能介绍之和172版本兼容设置