Android 入门第六讲01-网络编程(网络访问概述,通过HTTP访问网络(创建线程的两种方法),网络获取多个值的方法)

Android 入门第五讲02-QQ主界面demo(内附免费源码)(网络图片,圆形图片,RecyclerView点击事件,下拉刷新,上拉加载,开源控件的使用,底部按钮的样式切换)

1.网络访问概述

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

2.通过HTTP访问网络(获取单个数据)

这里补充一下,url可以访问两种形式
第一种是,www.baidu.com,这一种称为域名
第二种是,下图我们这种148.70.46.9/user由一串数字组成的称为IP地址(这里我访问的是我们老师搭建的服务器)
域名的一个好处就是比IP地址更加容易记住,访问域名需要通过DNS服务器来转化成ip地址,然后才能再去访问IP地址
还有补充就是
http请求数据一般不加密
https一般是加密的

1. 先与服务器建立连接

在这里插入图片描述

2. 异常捕捉

在这里插入图片描述

3. 向服务器发送请求和接收服务器返回的数据

在这里插入图片描述
代码


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
       //    URL url=new URL("http://www.baidu.com");//这访问的是域名
            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 temp;
            while ((temp=bufferedReader.readLine())!=null){//当temp读到的数据为空就结束
                Log.i("Main","temp :"+temp);

            }
            inputStream.close();
            reader.close();
            bufferedReader.close();
            //todo 关闭流
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.添加网络访问的权限

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

并且设置http请求为ture

android:usesCleartextTraffic="true"

在这里插入图片描述
然后我们运行,发现竟然还有问题?明明都很到位了,为什么还是不行?
在这里插入图片描述
翻译一下就是 网络访问在Main线程异常 言下之意就是说 网络访问不能放到Main线程当中

主线程在安卓是默认线程

那我们不能放到主线程,那我们放到哪里呢?二号线程?三号线程?
答案是: 我们可以自己创建一个线程,自己动手,丰衣足食

5.创建线程

方法一 通过继承thread

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

方法二 通过实现Runnable接口

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

6.将网络访问放到子线程

在这里插入图片描述
方法一运行(成功从服务器取到数据)
在这里插入图片描述
方法二运行(也成功从服务器取到数据)
在这里插入图片描述

7.将获取到的文本值赋值到控件

第一步,先拿到文本控件,然后再赋值
记得加id
在这里插入图片描述
在这里插入图片描述

那么问题又来了,我们如果要获取多个值怎么办?

3.网络获取多个值的方法

思路一 用字符串的结构去比对

可以先返回一段字符串,再对字符串进行切割

例如(用一个字符串表达多个字段):
test小明test15test今天星期五test
我们可以先找到第一个test的位置,拿到数据 小明
再找到第二个test的位置,拿到数据 15
再找到第三个test的位置,拿到数据 今天星期五
通过 split(“text”)方法或者算法

但是这个方法存在的问题就是,如果本身字段名里就包含了test,他就会将我们的字段再切割一次,所以这种方法理论上是可以,但实际上是行不通的。

思路二 xml结构

html
在这里插入图片描述
会根据<>text</>这种结构解析得到字段名
小明 15 今天星期五

在安卓里面也有两种方法帮助我们去解析xml,分别是 XmlPullParser 和 SAXParser,
这两类方法可以帮助我们去解析这个xml,从而得到我们所需要的数据

思路三 json 解析

但是前两种思路我在这不会重点讲述,主要讲述的是接下来的这一种方法-json 解析,但是json的数据结构略有不同,例如上面的数据 json表示是这样的:
"name":“小明”,“id”:15,“qzone”:"今天星期五"

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

为了让小伙伴们更加的了解 JSON,我会在下一讲重点单独围绕JSON来讲,所以本讲就到此结束啦,谢谢您的阅读,
Android 入门第六讲02-JSON(JSON数据结构简介,JSON 表示一个对象,JSON 格式表示数组,JSON嵌套,JSON 解析实战项目(源码免费))

猜你喜欢

转载自blog.csdn.net/qq_46526828/article/details/107415641