7、Android---网络技术
玩手机不能上网是单机的时代
而且现在的流量也出了无限使用
几乎网络离不开人们的日常生活
7.1、WebView的用法
遇到一些特殊的请求
在程序中展示一些网页
加载和显示网页都是浏览器的任务
在不打开浏览器的情况下先写一个浏览器
在Android中使用WebView控件即可
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</LinearLayout>
在MianActivity中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); WebView webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://www.baidu.com/"); }
使用getSettings()方法可以设置浏览器的属性
此时使用setJavaScriptEnabled()属性
使用setWebViewClient()方法设置当从一个页面跳转到另一个页面希望目标网页依然在当前的的WebView中i西安市
传入一个WebViewClient的实例
使用loadUrl()方法传入网址
同时还需要进行全县的声明:
此时运行:
此时的程序已经具有一个简易的浏览器功能
7.2、HTTP协议访问网络
对于HTTP协议:
工作原理:客户端向网络端发送一条HTTP请求
服务器端接收到请求之后返回一些数据给浏览器
然后客户端对这些数据进行解析和恶处理
WebView已经在后他做好了发送HTTP请求、接收服务的相应、解析返回数据、以及最终显示页面这几个工作
手动发送HTTP请求方式深入了解这一实现
7.2.1、使用HttpURLConnection
在Android上发送HTTP的请求一般有两种方式:
1、HttpURLConnection
2、HttpClient
由于后者存在的API数量过多
Android团队也不建议使用这种方式
在Android6.0系统中,已经将其完全移除
学习使用HttpURLConnection:
首先:获取到HttpURLConnection的实例,一般只需要new 一个URL对象
并传入目标的网络地址
然后再调用openConnection()方法即可:
URL url = new URL("http://www.baidu.com");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
在得到了HttpURLConnection的实例之后,可以设置HTTP的请求所有方法
常见的方法主要用:GRT、POST
GET:表示希望从服务器洪获取数据
POST:表示提交数据给服务器
写法:conn.serRequestMethod("GET")
接下来就是自由定制:设置超时连接 、读取数据超时的秒数、以及服务器西药得到的一些消息头等
conn.setConnectTimeout(1000)
conn.setReadTimeout(3000)
之后再调用getInputStream()方法就可以获得服务器返回的数据流
InputStream in = conn.getInputStream()
最后可以使用disconnect()方法将这恶HTTP连接关闭
conn.disconnect()
事件测试:
<Button
android:id="@+id/send_request"
android:text="send"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
<Scrollview>标签是再显示内容较多的情况下将屏幕外面的内容使用滚轮进行显示
public class MainActivity extends AppCompatActivity { TextView response_text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button send_request = (Button) findViewById(R.id.send_request);
response_text = (TextView) findViewById(R.id.response_text); send_request.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendRequest();
}
});
} private void sendRequest(){
//开启线程发起网路请求
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL("https://www.baidu.com");
connection= (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout();
connection.setReadTimeout();
InputStream in = connection.getInputStream();
//获取输入流进行读取
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null){
response.append(line);
}
showResponse(response.toString()); }catch (Exception e){
e.printStackTrace();
}finally {
if (reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null){
connection.disconnect();
}
}
}
}).start();
} public void showResponse(final String response){
Log.d("wwww", "showResponse: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
response_text.setText(response);
}
});
} }
这里还是要注册权限的:
点击按钮之后:
服务器返回的是HTML代码
只是通常情况下浏览器会将这些代码解析成网页
如果使用POST进行提交数据
并在输入流之前把要提交的数据写出即可
数据以键值对的形式讯在
只需要再上述中进行修改:
URL url = new URL("https://www.baidu.com");
connection= (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
DataOutputStream date = new DataOutputStream(connection.getOutputStream());
date.writeBytes("username=Mr&pwd=123455");
connection.setConnectTimeout();
connection.setReadTimeout();
InputStream in = connection.getInputStream();
7.2.2、使用OkHttp
有许多的通信库可以代替原生的HttpURLConnection
使用OkHttp是做的很出色的一个
是由Square公司开发的
再开源事业上贡献显著
除了OkHttp之后还有Picasso、Retrofit等
OkHttp不仅再接口上封装做的简易使用
连底层也是自成一派
现在已经成为很多人的首选网络通信库
首先需要引入:
会自动下载两个库:
1、OkHttp
2、Okio
后者是前者的通信基础
实现:
GET
首先创建一盒OkHttpClient实例
OkHttpClient client = new OkHttpClient();
接下来要想发送一条HTTP请求,就需要创建一盒request对象
Request request = new Request.Builder().build();
可以在最终的build()方法之前连缀很多其他的方法
Request.Builder().url("xxxxx")
.build();
之后调用OkHttpClient的newCall()方法创建一个Call对象
并且调用execute()方法来发送请求并且接收服务器的返回数据
Response response = client.newCall(request).execute();
Response对象就是服务器返回的数据
可以使用起得到返回的具体内容
String responseDate = response.body().string();
如果发送POST请求:
需要构建出一个RequestBody对象存放带提交的数据
然后再Request.Builder中调用post()方法:并且传入RequestBody
然后就是和GET请求一样调用execute()方法发送请求
public class MainActivity extends AppCompatActivity { TextView response_text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // WebView webView = (WebView) findViewById(R.id.web_view);
// webView.getSettings().setJavaScriptEnabled(true);
// webView.setWebViewClient(new WebViewClient());
// webView.loadUrl("https://www.baidu.com/"); Button send_request = (Button) findViewById(R.id.send_request);
response_text = (TextView) findViewById(R.id.response_text); send_request.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SendOkHttp();
}
});
} //OkHttpClient方法
private void SendOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.baidu.com").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public void showResponse(final String response){
Log.d("wwww", "showResponse: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
response_text.setText(response);
}
});
} }
此时测试的是GET
7.3、解析XML格式数据
正常情况下
每个需要访问网络的应用程序都会有一个自己的服务器
可以向服务器提交数据
也可以向服务器上获取数据
这些数据再网络上传输以什么格式进行传输?
1、XML
2、JSON
从哪能获取获取一段XML格式的数据?
可以搭建一个最简单的WEB服务器用来提供一段XML文本
然后在程序中访问这个服务器
再对得到的XML数据进行解析
使用xampp中的apache服务器进行测试:
新建data.xml文件
在服务器上进行访问:
此时的准别工作已经完成
7.3.1、Pull解析方式
解析xml格式的数据有很多方式
1、Pill解析
2、SAX解析
....
继承上述的实验:
public class MainActivity extends AppCompatActivity { TextView response_text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // WebView webView = (WebView) findViewById(R.id.web_view);
// webView.getSettings().setJavaScriptEnabled(true);
// webView.setWebViewClient(new WebViewClient());
// webView.loadUrl("https://www.baidu.com/"); Button send_request = (Button) findViewById(R.id.send_request);
response_text = (TextView) findViewById(R.id.response_text); send_request.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SendOkHttp();
}
});
} //OkHttpClient方法
private void SendOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://192.168.41.xxx/android/data.xml").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//showResponse(responseData);
parsrXnmPull(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} private void parsrXnmPull(String xmlDate){
try{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlDate));
int eventType = xmlPullParser.getEventType();
String id="";
String name = "";
String version = "";
while (eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch (eventType){
case XmlPullParser.START_TAG:{
if ("id".equals(nodeName)){
id = xmlPullParser.nextText();
}else if ("name".equals(nodeName)){
name = xmlPullParser.nextText();
}else if ("version".equals(nodeName)){
version = xmlPullParser.nextText();
}
break;
}
case XmlPullParser.END_TAG:{
if ("app".equals(nodeName)){
Log.d("id:", id);
Log.d("name:", name);
Log.d("version:", version);
}
break;
}
default:
break;
}
eventType=xmlPullParser.next();
}
}catch (Exception e){
e.printStackTrace();
}
}
public void showResponse(final String response){
Log.d("wwww", "showResponse: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
response_text.setText(response);
}
});
Log.d("aaa", response);
} }
点击事件触发:
将Http请求地址改成服务器的地址即可
首先获取一个XmlPullParserFactory的实例
借助这个实例得到XmlPullParser对象
然后调用XmlPullParser的setInput()方法将服务器返回的xml数据设置进去开始解析
解析过程:
通过getEventType()方法可以得到当前的解析事件
然后再while中进行不断的解析
当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还未完成,调用next()方法获得下一个解析事件
再while事件中:
发现节点名等于id、name、version,就调用nextText()方法获取节点的具体内容
没解析玩一个app节点就进行打印测试
7.3.2、SAX解析方式
继承DefaultHandler类,并且重写5个方法
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if ("id".equals(nodeName)){
id.append(ch,start,length);
}else if ("name".equals(nodeName)){
name.append(ch,start,length);
}else if ("version".equals(nodeName)){
version.append(ch,start,length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("app".equals(localName)){
Log.d("id:", id.toString().trim());
Log.d("name:", name.toString().trim());
Log.d("version:", version.toString().trim());
//将StringBuilder清空
id.setLength();
name.setLength();
version.setLength();
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
//OkHttpClient方法
private void SendOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://192.168.43.59/android/data.xml").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//showResponse(responseData);
//parsrXnmPull(responseData);
SAXXmlParse(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} private void SAXXmlParse(String xmlDate){
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//ContentHandler设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始解析
xmlReader.parse(new InputSource(new StringReader(xmlDate)));
}catch (Exception e){ e.printStackTrace(); } }
点击事件触发:
7.4、解析JSON格式数据
json具有体积小、再传送过程中更省流量
缺点:语义性差
private void SendOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://10.0.2.2/android/data_json.json").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//showResponse(responseData);
//parsrXnmPull(responseData);
//SAXXmlParse(responseData);
JsonObject(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} private void JsonObject(String jsonData){
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = ; i<jsonArray.length();i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.d("id:", id);
Log.d("name:", name);
Log.d("version:", version);
} }catch (Exception e){
e.printStackTrace();
} }
测试:
7.4.2、使用GSON
首先需要引入:
基本使用:
此时新建一个Person类:
public class Person {
private String id;
private String name;
private String version; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getVersion() {
return version;
} public void setVersion(String version) {
this.version = version;
}
}
//OkHttpClient方法
private void SendOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://10.0.2.2/android/data_json.json").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//showResponse(responseData);
//parsrXnmPull(responseData);
//SAXXmlParse(responseData);
//JsonObject(responseData);
GsonParse(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} //Gson
private void GsonParse(String jsonDate){
Gson gson = new Gson();
List<Person> personList = gson.fromJson(jsonDate,new TypeToken<List<Person>>(){}.getType()); for (Person person : personList){
Log.d("id:", person.getId());
Log.d("name:", person.getName());
Log.d("version:", person.getVersion());
}
}
结果:
此时的使用是非常简单的!!!
7、Android---网络技术的更多相关文章
- Android 网络技术HTTP
1.XML3种解析方式(DOM.SAX.PULL) 在网络上传输数据时最常用的格式有两种,XML 和JSON 这里首先明白什么是SAX是一个用于处理XML事件驱动的"推"模型,优点 ...
- 个人笔记——Android网络技术
一.WebView 的用法 Android 提供WebView 的用法,可以在自己的应用程序里嵌入一个浏览器 webView.getSettings().setJavaScriptEnabled(tr ...
- Android网络技术
WebView使用方法: 1.设置布局,在activity_main.xml中添加<webView> <LinearLayout...... <webView android: ...
- android 网络技术基础学习 (七)
使用httpclient协议访问网络: public class MainActivity extends Activity implements OnClickListener{ public vo ...
- Android网络技术之WebView常用方法
public class WebViewTest extends Activity { private WebView wv; private EditText et; ...
- Android基础总结(9)——网络技术
这里主要讲的是如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android最常使用到的网络技术了. 1.WebView的用法 Android提供的WebVie ...
- Android学习之基础知识十二 — 第一讲:网络技术的使用
这一节主要讲如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android中最常用的网络技术. 一.WebView的用法 有时候我们可能会碰到比较特殊的需求,比 ...
- [转载] Android逃逸技术汇编
本文转载自: http://blogs.360.cn/360mobile/2016/10/24/android_escape/ 摘 要 传统逃逸技术涉及网络攻防和病毒分析两大领域,网络攻防领域涉 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android网络编程概述
Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...
随机推荐
- @valid注解
今天发现一个非常好用的注解直接上代码: 实体类domain: @Column(name = "NAME") @NotNull @Size(min = 2,max = 50) pri ...
- 各种IDE的使用
sharpdevelop http://blog.sina.com.cn/s/blog_d1001bff0101di7p.html
- Linux排查Java程序占用CPU很高的解决办法
Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...
- package.json参数简单介绍
概述: 每个项目的根目录下都会有一个package.json文件,定义了项目所需的模块,以及项目信息.执行npm install 命令会自动下载package.json中配置的模块,也就是配置项目的运 ...
- Django基础五之django模型层(一)单表操作
一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- ios或者cocos2d-x开发在Xcode编译时自适应失效,获取屏幕尺寸不准确
在cocos2d-x的开发中,发现之前很好使的 setDesignResolutionSize(960.0f, 640.0f, kResolutionExactFit)自适应不好用了,后来调试发现不是 ...
- ReactNative应用<DCL每日查看>开发总结
App效果: 功能和交互简单描述: 针对微信使用用户每天的零碎时间来进行天气,新闻要点等查看,免去了打开其他App来查看; 针对每一天可以设置一项重要任务计划,可开启通知提醒,让每一天任务简化,免去太 ...
- redis 集群目标、集群查看、配置方法及过程、哨兵配置启动
集群目标 主从复制,读写分离:故障切换(通过哨兵实现) 查看集群状态 info replication 配置方法 只设置从数据库就可以了:最佳实践,在主数据库配置masterauth <mast ...
- oracle 企业管理器及无线网环境下配置方法
注意: oracle em 的访问地址在 D:\oracle\product\11.2.0\dbhome_1\install 下的文件里. 如果在windows 安装oracle,并且在本地访问,or ...
- Phoenix介绍(持续更新)
现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等.今天主要记录Phoenix. phoenix,中文译为“凤凰”,很美的名字.Phoenix是 ...