網(wǎng)站首頁 編程語言 正文
安卓開發(fā)網(wǎng)絡(luò)請求可謂是安卓開發(fā)的靈魂,如果你不會網(wǎng)絡(luò)請求,那么你開發(fā)的應(yīng)用軟件就是一具沒有靈魂的枯骨。
在安卓開發(fā)中進(jìn)行網(wǎng)絡(luò)請求和java中的網(wǎng)絡(luò)請求有異曲同工之妙,但是安卓軟件畢竟的安裝在我們手機(jī)上的,而平常的應(yīng)用軟件下載后會要求你給與權(quán)限,否則就沒辦法使用,網(wǎng)絡(luò)請求也需要對應(yīng)的權(quán)限,否則就沒法進(jìn)行聯(lián)網(wǎng)操作。
首先在AndroidManifest.xml文件中添加網(wǎng)絡(luò)請求權(quán)限。要在manifest標(biāo)簽內(nèi),application標(biāo)簽外添加
<uses-permission android:name="android.permission.INTERNET" />
新建java文件,創(chuàng)建靜態(tài)方法,返回請求后的結(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ò)請求
connection.setRequestMethod("GET");//請求方式
connection.setConnectTimeout(8000);//連接最大時(shí)間
connection.setReadTimeout(8000);//讀取最大時(shí)間
InputStream in = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));//寫入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流開了要關(guān),不然容易內(nèi)存泄露
}catch (IOException e){
e.printStackTrace();
}
}
if(connection != null){
connection.disconnect();//同理,關(guān)閉http連接
}
}
return response.toString();
}
}
我們寫好了一個(gè)最基本的不帶任何框架的網(wǎng)絡(luò)請求方法,該方法支持不帶Header的get請求,能夠通過get方法獲取到我們想要的數(shù)據(jù),這里responese是StringBuffer類是因?yàn)樵讷@取到了BufferedReader后,要通過while循環(huán)將數(shù)據(jù)寫入String中,StringBuffer類對比String類來說更適合進(jìn)行這種頻繁寫入的操作。
接下來讓我們?nèi)ナ褂梦覀兊倪@個(gè)方法進(jìn)行一個(gè)最基本的網(wǎng)絡(luò)請求吧,我們通過get方法請求一下百度的網(wǎng)址看看他會返回什么給我們。
在MainActivity的onCreate方法中進(jìn)行網(wǎng)絡(luò)請求
@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ò)!
安卓開發(fā)中網(wǎng)絡(luò)請求操作是一種耗時(shí)操作,安卓中不允許在主線程中進(jìn)行網(wǎng)絡(luò)請求操作,java代碼的運(yùn)行規(guī)律是自上而下,一旦中途發(fā)生網(wǎng)絡(luò)請求這種耗時(shí)操作,單反你網(wǎng)卡一點(diǎn),或者沒有網(wǎng)絡(luò),那么下面的代碼都會被卡死,無法執(zhí)行,容易造成線程堵塞,就像堵車一樣。所以我們要例外開一條路疏通車流,這就是子線程。
我們的網(wǎng)絡(luò)請求需要在子線程中去進(jìn)行,在安卓開發(fā)中開啟子線程非常的簡單,無需為了這個(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();
}
那么我們看看能拿到什么東西吧
我們看到,我們成功拿到了百度首頁的html數(shù)據(jù),這邊我們也可以在瀏覽器上打開百度,然后f12查看是一樣的。
相信你們試驗(yàn)一下,會發(fā)現(xiàn)有時(shí)會爆出錯(cuò)誤信息
Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
這是因?yàn)閍ndroid自2019年11月1日起不在運(yùn)行http請求。那么我們要怎樣去解決這個(gè)問題呢
1、降低sdk版本
在build.gradle(app)中修改targetSdkVersion和minSdkVersion為26,這是安卓8.0對應(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請求適配--> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
獲取到網(wǎng)絡(luò)數(shù)據(jù)后修改ui視圖
相信不少同學(xué)在獲取到數(shù)據(jù)后就想去嘗試將textview或者其他的組件中的text修改成自己拿到的數(shù)據(jù)吧。
在修改前,我們要注意些問題:首先,安卓開發(fā)中你無法在子線程中操作ui,否則會爆出Only the original thread that created a view hierarchy can touch its views.錯(cuò)誤,那么我們該怎么去修改視圖呢。
答案很簡單,android的Activity類給了我們這個(gè)一個(gè)方法runOnUiThread方法,它能夠在子線程中去修改ui視圖,它的使用也很簡單
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)最簡單的網(wǎng)絡(luò)請求修改數(shù)據(jù)了。
原文鏈接:https://www.cnblogs.com/nhgtx/p/16913804.html
相關(guān)推薦
- 2022-05-17 ubuntu Could NOT find CURL (missing: CURL_LIBRARY
- 2022-07-21 TensorRT之mmdeploy使用
- 2022-03-05 centos7下搭建DNS服務(wù)器介紹_Linux
- 2022-03-24 C++?Primer的變量和基本類型詳解_C 語言
- 2022-11-24 Python模板的使用詳細(xì)講解_python
- 2022-07-28 超級詳細(xì)講解C++中的多態(tài)_C 語言
- 2023-06-18 C#?Marshal類基本概念和入門實(shí)例講解_C#教程
- 2022-09-27 Go實(shí)現(xiàn)凱撒密碼加密解密_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支