Android基础知识——使用网络技术
Posted ABded
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android基础知识——使用网络技术相关的知识,希望对你有一定的参考价值。
文章目录
1.WebView的用法
有时候我么可能会遇到一些比较特殊的需求,比如说要在应用程序里展示一些网页,但又明确指出不允许打开系统的浏览器。这个时候我们就可以利用WebView控件,帮助我们在自己的应用程序中嵌入一个浏览器,从而轻易的展示各种各样的网页。
使用步骤:
1.在布局文件中添加WebView控件。
2.在活动中获得WebView实例。
3.让WebView支持js脚本。
4.让网页在WebView中打开。
5.传入网址
示例:
//步骤一
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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" />
</LinearLayout>
public class MainActivity extends AppCompatActivity
@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");//步骤五
这里还有一点要注意的,打开网页属于网络操作,所以我们需要在AndroidManifest.xml文件中申请权限。
<uses-permission android:name="android.permission.INTERNET" />
2.使用HTTP协议访问网络
HTTP协议,它的工作原理就是客户端向服务器发出一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。
Android上发送HTTP请求一般有两种方式:HttpURLConnection和OkHttp。接下来我们就来分别学习一下这两种方式。
2.1使用HttpURLConnection
使用步骤:
1.获取URL实例,并在器构造参数中传入网址。
2.获取HttpURLConnection实例。
3.给HttpURLConnection设置请求模式"GET"或"POST"。
4.给HttpURLConnection进行自由定制。
5.用IO操作来解析获得的数据。
示例:
//布局文件
<?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">
<Button
android:id="@+id/button"
android:text="Button"
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/text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
//活动中的代码
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button=(Button) findViewById(R.id.button);
final TextView textView=(TextView) findViewById(R.id.text);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
new Thread(new Runnable() //所有的网络操作或耗时操作都需在子线程中进行
@Override
public void run()
BufferedReader reader = null;
HttpURLConnection connection = null;
try
URL url=new URL("https://www.baidu.com");//步骤一
connection= (HttpURLConnection) url.openConnection();//步骤二
connection.setRequestMethod("GET");//步骤三
connection.setReadTimeout(8000);//步骤四 这里设置了读取超时的毫秒数
connection.setConnectTimeout(8000);//这里设置了链接超时的毫秒数
InputStream in=connection.getInputStream();//步骤五
reader=new BufferedReader(new InputStreamReader(in));
final StringBuilder content=new StringBuilder();
String line;
while((line=reader.readLine())!=null)
content.append(line);
MainActivity.this.runOnUiThread(new Runnable() //不能在子线程中更改UI,故采取该措施
@Override
public void run()
textView.setText(content);
);
catch (Exception e)
e.printStackTrace();
finally
if(reader!=null)
try
reader.close();
catch (IOException e)
e.printStackTrace();
if(connection!=null)
connection.disconnect();
).start();
);
若是想要提交数据给服务器,只需要将HTTP请求的方法改为POST,并在获取输入流之前把要提交的数据写出即可。注意每条数据都要以键值对的形式存在,数据与数据之间用"&"符合隔开。
示例:
connection.setRequestMethod("POST");
DataOutputStream out=new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=123456");
2.2使用OkHttp
OkHttp是一个著名的开源项目,它相较于HttpURLConnection来说更加的简单易用。项目主页
使用步骤:
1.添加依赖。
2.获取OkHttpClient实例。
3.获得Request实例,采用连缀的方式为其添加url。
4.获得Response实例,服务器所返回的数据就存储在response中。
示例:
//步骤一
dependencies
implementation 'com.squareup.okhttp3:okhttp:4.8.1'
//
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button=(Button) findViewById(R.id.button);
final TextView textView=(TextView) findViewById(R.id.text);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
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();//步骤四
final String content=response.body().string();
MainActivity.this.runOnUiThread(new Runnable()
@Override
public void run()
textView.setText(content);
);
catch (Exception e)
e.printStackTrace();
).start();
);
如果你想要提交数据给服务器,就要先构建一个RequestBody实例来存放待提交的数据,然后在Request.Builder中调用post()方法,并将RequestBody实例传入。
示例:
RequestBody requestBody=new FormBody.Builder()
.add("username","admin")
.add("password","123456")
.build();
Request request= new Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build();
3.解析XML格式数据
在网络上传输数据时最常用的格式有两种:XML和JSON,接下来我们就来逐一进行学习。
解析XML格式数据的方式一般有两种:Pull解析和SAX解析。
我们要解析的XML数据:
<apps>
<app>
<id>1</id>
<name>Google maps</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Google Play</name>
<version>2.3</version>
</app>
</apps>
3.1Pull解析方式
使用步骤:
1.获取XmlPullParserFactory实例x。
2.获取XmlPullParser实例。
3.给xmlPullParser实例添加待解析的数据。
4.开始解析。
示例:
private void parseXMLWithPull(String xmlData)
try
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();//步骤一
XmlPullParser parser=factory.newPullParser();//步骤二
parser.setInput(new StringReader(xmlData));//步骤三
int eventType=parser.getEventType();//步骤四
String id="";
String name="";
String version="";
while (eventType!=XmlPullParser.END_DOCUMENT)
String nodeName=parser.getName();
switch (eventType)
//开始解析某个节点
case XmlPullParser.START_TAG:
if ("id".equals(nodeName))
id = parser.nextText();
else if ("name".equals(nodeName))
name = parser.nextText();
else if ("version".equals(nodeName))
version = parser.nextText();
break;
//完成解析某个节点
case XmlPullParser.END_TAG:
if("app".equals(nodeName))
Log.e("MainActivity",id );
Log.e("MainActivity",name );
Log.e("MainActivity",version );
break;
default:
break;
eventType=parser.next();
catch (Exception e)
e.printStackTrace();
3.2SAX解析方式
使用步骤:
1.新建一个类继承DefaultHandler类,并重写其中的5大方法。
2.获取SAXParserFactory实例。
3.获取XMLReader实例。
4.获取新建类的实例。
5.给XMLReader设置Handler。
6.给XMLReader传入待解析的数据。
示例:
//步骤一
public class MyHandler extends DefaultHandler
StringBuilder id;
StringBuilder name;
StringBuilder version;
String nodeName;
@Override
public void startDocument() throws SAXException //开始解析时
super.startDocument();
id=new StringBuilder();
name=new StringBuilder();
version=new StringBuilder();
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException //解析某个节点时
super.startElement(uri, localName, qName, attributes);
//记录当前节点名
nodeName=localName;
@Override
public void characters(char[] ch, int start, int length) throws SAXException //获取节点中内容时
super.characters(ch, start, length);
//根据当前节点名判断将内容添加到哪一个StringBuilder中
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 //完成解析某个节点时
super.endElement(uri, localName, qName);
if("app".equals(nodeName))
Log.e("MyHandler",id.toString().trim());
Log.e("MyHandler",name.toString().trim());
Log.e("MyHandler",version.toString().trim());
//最后要将StringBuilder清空掉,否则会影响下一次内容的读取
id.setLength(0);
name.setLength(0);
version.setLength(0);
@Override
public void endDocument() throws SAXException //完成解析时
super.endDocument();
//活动中代码
private void parseXMLWithSAX(String xmlData)
try
SAXParserFactory factory=SAXParserFactory.newInstance();//步骤二
XMLReader reader=factory.newSAXParser().getXMLReader();//步骤三
MyHandler myHandler=new MyHandler();//步骤四
reader.setDTDHandler(myHandler);//步骤五
reader.parse(new InputSource(new StringReader(xmlData)));//步骤六
catch (Exception e)
e.printStackTrace();
4.解析JSON数据
接下来我们来学习如何解析JSON格式的数据。比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观。
解析JSON格式数据的方式一般有两种:JSONObject解析和GSON解析。
我们要解析的JSON数据:
["id":"5","version":"5.5","name":"Clash of Clans",
"id":"6","version":"7.0","name":"Boom Beach",
"id":"7","version":"3.5","name":"Clash Royale"]
4.1使用JSONObiect
使用步骤:
1.将待处理的数据传入到一个JSONArray对象中。
2.遍历JSON数组,获取数据。
示例:
private void parseJSONWithJSONObject(String jsonData)
try
JSONArray array=new JSONArray(jsonData);//步骤一
for(int i=0;i<array.length();i++)//步骤二
JSONObject object=array.getJSONObject(i);
String id=object.getString("id");
String name=object.getString("name");
String version=object.getString("version");
以上是关于Android基础知识——使用网络技术的主要内容,如果未能解决你的问题,请参考以下文章
Android 基础知识 -- BroadcastReceiver
在 android 11 中使用 intent.resolveActivity 时调用此方法时,请考虑在清单中添加查询声明
Android Fragment 隐藏或显示时调用的生命周期方法