0
点赞
收藏
分享

微信扫一扫

Android-第九节网络编程

目录

一、网络访问概述

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

开启网络访问权限

<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 = new Thread(){//方法1
@Override
public void run() {
super.run();
//子线程
}
};
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 {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread(){//方法1
@Override
public 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 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 {

@Override
protected 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
@Override
public void run() {
super.run();
//子线程
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);
Thread.sleep(2000);//模拟网络请求时间比较长
String finalResult=temp;

runOnUiThread(new Runnable() {
@Override
public void run() {
try {
textView.setText(finalResult);
} catch (Exception e) {
e.printStackTrace();
}
}
});


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

}
}


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

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

方法二:xml结构

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

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

举报

相关推荐

0 条评论