一文帶你了解Android中的網(wǎng)絡(luò)請(qǐng)求
安卓開(kāi)發(fā)網(wǎng)絡(luò)請(qǐng)求可謂是安卓開(kāi)發(fā)的靈魂,如果你不會(huì)網(wǎng)絡(luò)請(qǐng)求,那么你開(kāi)發(fā)的應(yīng)用軟件就是一具沒(méi)有靈魂的枯骨。
在安卓開(kāi)發(fā)中進(jìn)行網(wǎng)絡(luò)請(qǐng)求和java中的網(wǎng)絡(luò)請(qǐng)求有異曲同工之妙,但是安卓軟件畢竟的安裝在我們手機(jī)上的,而平常的應(yīng)用軟件下載后會(huì)要求你給與權(quán)限,否則就沒(méi)辦法使用,網(wǎng)絡(luò)請(qǐng)求也需要對(duì)應(yīng)的權(quán)限,否則就沒(méi)法進(jìn)行聯(lián)網(wǎng)操作。
首先在AndroidManifest.xml文件中添加網(wǎng)絡(luò)請(qǐng)求權(quán)限。要在manifest標(biāo)簽內(nèi),application標(biāo)簽外添加
<uses-permission android:name="android.permission.INTERNET" />
新建java文件,創(chuàng)建靜態(tài)方法,返回請(qǐng)求后的結(jié)果
package com.example.smartcity.Net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class Internet { public static String get(String src){ HttpURLConnection connection = null; BufferedReader reader = null; StringBuilder response = null; try{ URL url = new URL(src);//新建URL connection = (HttpURLConnection)url.openConnection();//發(fā)起網(wǎng)絡(luò)請(qǐng)求 connection.setRequestMethod("GET");//請(qǐng)求方式 connection.setConnectTimeout(8000);//連接最大時(shí)間 connection.setReadTimeout(8000);//讀取最大時(shí)間 InputStream in = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(in));//寫(xiě)入reader response = new StringBuilder(); String line; while((line = reader.readLine()) != null){ response.append(line); } }catch (Exception e){//異常拋出 e.printStackTrace(); }finally { if(reader != null){ try{ reader.close();//io流開(kāi)了要關(guān),不然容易內(nèi)存泄露 }catch (IOException e){ e.printStackTrace(); } } if(connection != null){ connection.disconnect();//同理,關(guān)閉http連接 } } return response.toString(); } }
我們寫(xiě)好了一個(gè)最基本的不帶任何框架的網(wǎng)絡(luò)請(qǐng)求方法,該方法支持不帶Header的get請(qǐng)求,能夠通過(guò)get方法獲取到我們想要的數(shù)據(jù),這里responese是StringBuffer類是因?yàn)樵讷@取到了BufferedReader后,要通過(guò)while循環(huán)將數(shù)據(jù)寫(xiě)入String中,StringBuffer類對(duì)比String類來(lái)說(shuō)更適合進(jìn)行這種頻繁寫(xiě)入的操作。
接下來(lái)讓我們?nèi)ナ褂梦覀兊倪@個(gè)方法進(jìn)行一個(gè)最基本的網(wǎng)絡(luò)請(qǐng)求吧,我們通過(guò)get方法請(qǐng)求一下百度的網(wǎng)址看看他會(huì)返回什么給我們。
在MainActivity的onCreate方法中進(jìn)行網(wǎng)絡(luò)請(qǐng)求
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String s = Internet.get("https://www.baidu.com"); System.out.println(s); }
是不是以為這就結(jié)束了?錯(cuò)!
安卓開(kāi)發(fā)中網(wǎng)絡(luò)請(qǐng)求操作是一種耗時(shí)操作,安卓中不允許在主線程中進(jìn)行網(wǎng)絡(luò)請(qǐng)求操作,java代碼的運(yùn)行規(guī)律是自上而下,一旦中途發(fā)生網(wǎng)絡(luò)請(qǐng)求這種耗時(shí)操作,單反你網(wǎng)卡一點(diǎn),或者沒(méi)有網(wǎng)絡(luò),那么下面的代碼都會(huì)被卡死,無(wú)法執(zhí)行,容易造成線程堵塞,就像堵車一樣。所以我們要例外開(kāi)一條路疏通車流,這就是子線程。
我們的網(wǎng)絡(luò)請(qǐng)求需要在子線程中去進(jìn)行,在安卓開(kāi)發(fā)中開(kāi)啟子線程非常的簡(jiǎn)單,無(wú)需為了這個(gè)線程新建一個(gè)方法或類。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { String s = Internet.get("https://www.baidu.com"); System.out.println(s); } }).start(); }
那么我們看看能拿到什么東西吧
我們看到,我們成功拿到了百度首頁(yè)的html數(shù)據(jù),這邊我們也可以在瀏覽器上打開(kāi)百度,然后f12查看是一樣的。
相信你們?cè)囼?yàn)一下,會(huì)發(fā)現(xiàn)有時(shí)會(huì)爆出錯(cuò)誤信息
Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
這是因?yàn)閍ndroid自2019年11月1日起不在運(yùn)行http請(qǐng)求。那么我們要怎樣去解決這個(gè)問(wèn)題呢
1、降低sdk版本
在build.gradle(app)中修改targetSdkVersion和minSdkVersion為26,這是安卓8.0對(duì)應(yīng)的sdk版本
2、配置network-security-config
在AndroidManifest.xml文件的application標(biāo)簽中添加一行
android:networkSecurityConfig="@xml/network"
在res文件下新建xml文件夾,然后新建network.xml文件,將如下代碼粘貼至文件內(nèi),該文件內(nèi)只保留下列代碼即可
<?xml version="1.0" encoding="utf-8"?> <!--Android 9.0 http請(qǐng)求適配--> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
獲取到網(wǎng)絡(luò)數(shù)據(jù)后修改ui視圖
相信不少同學(xué)在獲取到數(shù)據(jù)后就想去嘗試將textview或者其他的組件中的text修改成自己拿到的數(shù)據(jù)吧。
在修改前,我們要注意些問(wèn)題:首先,安卓開(kāi)發(fā)中你無(wú)法在子線程中操作ui,否則會(huì)爆出Only the original thread that created a view hierarchy can touch its views.錯(cuò)誤,那么我們?cè)撛趺慈バ薷囊晥D呢。
答案很簡(jiǎn)單,android的Activity類給了我們這個(gè)一個(gè)方法runOnUiThread方法,它能夠在子線程中去修改ui視圖,它的使用也很簡(jiǎn)單
runOnUiThread(new Runnable() { @Override public void run() { button.setText(s);//修改視圖 } });
那么,我們得出最終的代碼
new Thread(new Runnable() { @Override public void run() { String s = Internet.get("http://www.baidu.com"); runOnUiThread(new Runnable() { @Override public void run() { button.setTag(s); } }); System.out.println(s); } }).start();
這樣就可以實(shí)現(xiàn)最簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求修改數(shù)據(jù)了。
到此這篇關(guān)于一文帶你了解Android中的網(wǎng)絡(luò)請(qǐng)求的文章就介紹到這了,更多相關(guān)Android網(wǎng)絡(luò)請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android 網(wǎng)絡(luò)請(qǐng)求框架解析之okhttp與okio
- Android網(wǎng)絡(luò)請(qǐng)求-sign參數(shù)的設(shè)置方式
- Android網(wǎng)絡(luò)請(qǐng)求框架Retrofit詳解
- Android開(kāi)發(fā)中的幾種網(wǎng)絡(luò)請(qǐng)求方式詳解
- Android HTTP網(wǎng)絡(luò)請(qǐng)求的異步實(shí)現(xiàn)
- Android最基本的異步網(wǎng)絡(luò)請(qǐng)求框架
- Android網(wǎng)絡(luò)請(qǐng)求庫(kù)android-async-http介紹
相關(guān)文章
Android編程實(shí)現(xiàn)自定義Tab選項(xiàng)卡功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義Tab選項(xiàng)卡功能,結(jié)合完整實(shí)例形式分析了Android自定義tab選項(xiàng)卡的遍歷、設(shè)置及屬性操作相關(guān)技巧,需要的朋友可以參考下2017-02-02Android實(shí)現(xiàn)判斷某個(gè)服務(wù)是否正在運(yùn)行的方法
這篇文章主要介紹了Android實(shí)現(xiàn)判斷某個(gè)服務(wù)是否正在運(yùn)行的方法,涉及Android針對(duì)系統(tǒng)服務(wù)運(yùn)行狀態(tài)的判斷技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10詳解Android首選項(xiàng)框架的使用實(shí)例
首選項(xiàng)這個(gè)名詞對(duì)于熟悉Android的朋友們一定不會(huì)感到陌生,它經(jīng)常用來(lái)設(shè)置軟件的運(yùn)行參數(shù)。本篇文章主要介紹詳解Android首選項(xiàng)框架的使用實(shí)例,有興趣的可以了解一下。2016-11-11android view轉(zhuǎn)Bitmap生成截圖的方法
這篇文章主要介紹了android view轉(zhuǎn)Bitmap生成截圖的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Android通過(guò)AIDL在兩個(gè)APP之間Service通信
這篇文章主要為大家詳細(xì)介紹了Android通過(guò)AIDL在兩個(gè)APP之間Service通信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05android實(shí)用工具類分享(獲取內(nèi)存/檢查網(wǎng)絡(luò)/屏幕高度/手機(jī)分辨率)
這篇文章主要介紹了android實(shí)用工具類,包括獲取內(nèi)存、檢查網(wǎng)絡(luò)、屏幕高度、手機(jī)分辨率、獲取版本號(hào)等功能,需要的朋友可以參考下2014-03-03android通過(guò)代碼的形式來(lái)實(shí)現(xiàn)應(yīng)用程序的方法
因?yàn)閼?yīng)用程序的安裝與卸載模塊在android系統(tǒng)中已經(jīng)寫(xiě)好了,所以我們只需要激活就行了2013-10-10