Android入門(15)| 網絡

文章目錄

  • WebView
  • HTTP
    • 使用HttpURLConnection
    • 使用OkHttp
  • 封裝網絡操作
    • 封裝HttpURLConnection
    • 封裝OkHttp


WebView

WebView 可以在 應用程序中(而不是瀏覽器) 展示一些網頁。

布局文件 web_layout.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

活動文件:

public class WebActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.web_layout);WebView webView = findViewById(R.id.web_view);// 使WebView支持JavaScript腳本webView.getSettings().setJavaScriptEnabled(true);// 用當前WebView顯示網頁而不是瀏覽器webView.setWebViewClient(new WebViewClient());webView.loadUrl("https://www.bilibili.com/");}
}

要在 Android 中使用網絡技術是需要在 AndroidManifest.xml 中聲明權限的:

<uses-permission android:name="android.permission.INTERNET" />

運行結果:
在這里插入圖片描述


HTTP

使用HttpURLConnection

布局文件 http_layout.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_sendRequest"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="發送請求"/><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/response_text"android:layout_width="match_parent"android:layout_height="wrap_content"/></ScrollView></LinearLayout>
  • ScrollView控件: 以滾動形式查看屏幕外的內容。
  • TextView控件: 用以顯示服務器返回的數據。

活動文件:

public class HTTPActivity extends AppCompatActivity {private static final String TAG = "HTTPActivity";TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.http_layout);Button button_sendRequest = findViewById(R.id.button_sendRequest);responseText = findViewById(R.id.response_text);button_sendRequest.setOnClickListener(v->{sendRequestWithHttpURLConnection();Log.e(TAG, "click over");});}private void sendRequestWithHttpURLConnection() {// 開啟子線程來發起網絡請求new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try {URL url = new URL("https://www.csdn.net/");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream in = connection.getInputStream();Log.e(TAG, "get in");// 下面對獲取到的輸入流進行讀取reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while((line = reader.readLine()) != null){response.append(line);}Log.e(TAG, "run: "+response.toString());// 安卓不允許在子線程中進行UI操作// 通過runOnUiThread切換為主線程,然后將結果顯示到界面中runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(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();}
}

運行結果:
在這里插入圖片描述


使用OkHttp

OkHttp項目在github上的主頁地址

build.gradle (:app) 文件的 dependencies 中添加依賴:

	// define a BOM and its versionimplementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.3"))// define any required OkHttp artifacts without versionimplementation("com.squareup.okhttp3:okhttp")

活動文件:

public class HTTPActivity extends AppCompatActivity {private static final String TAG = "HTTPActivity";TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.http_layout);Button button_sendRequest = findViewById(R.id.button_sendRequest);responseText = findViewById(R.id.response_text);button_sendRequest.setOnClickListener(v->{sendRequestWithOkHttp();Log.e(TAG, "click over");});}private void sendRequestWithOkHttp() {// 開啟子線程來發起網絡請求new Thread(new Runnable() {@Overridepublic void run() {try {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://www.bilibili.com").build();Log.e(TAG, "request: "+request);Response response = client.newCall(request).execute();Log.e(TAG, "response: "+response);String responseData = response.body().string();Log.e(TAG, "responseData: "+responseData);runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(responseData);}});} catch (IOException e) {e.printStackTrace();}}}).start();}
}

運行結果:
在這里插入圖片描述


封裝網絡操作

封裝HttpURLConnection

如果在每個使用到網絡功能的地方都實現一遍發送HTTP請求的代碼無疑是繁瑣的。因此,不妨將常用的網絡操作寫成一個個靜態方法,并將它們都存儲在一個類中,如:

public class HttpUtil {private static final String TAG = "HttpUtil";public static String sendHttpRequest(String address){HttpURLConnection connection = null;try {URL url =new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while((line = reader.readLine()) != null){response.append(line);}return response.toString();} catch (Exception e) {e.printStackTrace();return e.getMessage();} finally {if(connection != null){connection.disconnect();}}}
}

如此一來需要發送HTTP請求時即可如此實現:

String url = "https://www.bilibili.com";
String response = HttpUtil.sendHttpRequest(url);

但這仍有缺陷,sendHttpRequest() 方法內部并沒有使用子線程,這意味著調用該方法時主線程有可能被阻塞,網絡請求又是耗時操作,這對于運行效率而言無疑是種災難。

而如果只是簡單地在 sendHttpRequest() 方法中開啟一個線程來發起HTTP請求,那么所有的耗時邏輯都是在子線程里進行的,sendHttpRequest() 方法會在 服務器還沒來得及響應 的時候就執行結束了(子線程中的邏輯還沒有執行完,主線程中已經結束了對sendHttpRequest() 方法的調用)。

因此應該配以回調機制來接受回饋數據,定義一個接口:

public interface HttpCallbackListener {// 成功響應時回調,參數為服務器返回的數據void onFinish(String response);// 操作錯誤時回調void onError(Exception e);
}

然后修改 HttpUtil.java

public class HttpUtil {private static final String TAG = "HttpUtil";public static void sendHttpRequest(final String address, HttpCallbackListener listener){new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;try {URL url =new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while((line = reader.readLine()) != null){response.append(line);}// 子線程中無法通過 return 返回數據,應通過 onFinish 方法回調if(listener != null){listener.onFinish(response.toString());Log.e(TAG, "run: "+response.toString());}} catch (Exception e) {if(listener != null){listener.onError(e);Log.e(TAG, "run: Exception");}} finally {if(connection != null){connection.disconnect();}}}}).start();}
}

此時我們調用 sendHttpRequest() 方法時需要將 HttpCallbackListener 的實例傳入:

    private void sendRequestWithOkHttp() {// 開啟子線程來發起網絡請求new Thread(new Runnable() {@Overridepublic void run() {String url = "https://www.baidu.com";HttpUtil.sendHttpRequest(url, new HttpCallbackListener() {@Overridepublic void onFinish(String response) {runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(response);}});}@Overridepublic void onError(Exception e) {Log.e(TAG, "onError: "+e);}});}}).start();}

運行結果:
在這里插入圖片描述


封裝OkHttp

封裝關于HTTP的操作:

public class HttpUtil {private static final String TAG = "HttpUtil";public static void sendHttpRequest(final String address, okhttp3.Callback callback){OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(address).build();Log.e(TAG, "request: "+request);client.newCall(request).enqueue(callback);}
}

調用 HttpUtil.sendHttpRequest() 發送請求的方法:

    // 開啟子線程來發起網絡請求,OkHttpprivate void sendRequestWithOkHttp(){new Thread(new Runnable() {@Overridepublic void run() {HttpUtil.sendHttpRequest("https://www.bilibili.com", new okhttp3.Callback(){@Overridepublic void onResponse(Call call, Response response) throws IOException {String responseData = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(responseData);}});}@Overridepublic void onFailure(Call call, IOException e) {Log.e(TAG, "onError: "+e);}});}}).start();}

PS: 不論是使用 HttpURLConnection 還是 OkHttp最終的回調接口都還是在子線程中,因此如果想要執行 UI 操作必須借助 runOnUiThread() 方法進行線程轉換。

運行結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443694.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…

項目積壓需求項目計劃_需求變更頻繁,項目經理如何做好需求管理?

項目實施過程中&#xff0c;項目經理常常面臨一個重大挑戰——需求變更。需求變更無處不在&#xff0c;市場條件變化、新業務出現、戰略目標調整、客戶需求修改、資源限制等&#xff0c;都會造成需求變更。需求變更會影響項目的時間、成本和質量&#xff0c;對整個項目和團隊成…

Android | Sensor.TYPE_ORIENTATION被廢棄后的解決辦法

文章目錄概述getOrientation 方法根據 旋轉矩陣R 獲取 設備旋轉弧度getRotationMatrix 方法根據 地磁場、加速度傳感器對象 獲取 旋轉矩陣R代碼參考資料概述 Sensor.TYPE_ORIENTATION 常數在 API 8 中已棄用&#xff0c;官方推薦使用 SensorManager.getOrientation() 替代。關…

【JAVA 開發小問題】 | String操作合集

文章目錄截取特定兩個字符之間的字符串截取特定兩個字符之間的字符串 利用正則表達式&#xff0c;圖片來源

uniapp 刷新后數據都沒有了_環境溫度傳感器都沒有連接,竟然還會有數據?

福田歐曼GTL(福康發動機、康明斯2880系統)匹配ECoffit尿素泵●故障現象&#xff1a;OBD故障燈點亮&#xff0c;不燒尿素&#xff0c;油耗高&#xff0c;動力不足●故障碼&#xff1a;●維修分析&#xff1a;①故障指出加熱器問題&#xff0c;摸下尿素箱溫度&#xff0c;發現燙手…

Android | 再探 RecyclerView 之名詞解析

文章目錄Adapter、ViewHolderchild viewLayoutManagerRecyclerScrapDirtyIndexPositionlayout position 和 adapter position四級緩存瀏覽本文前推薦先閱讀 Android入門&#xff08;九&#xff09;| 滾動控件 ListView 與 RecyclerView Adapter、ViewHolder Adapter: A subcla…

Linux學習:第一章-Linux簡介

一 UNIX發展史1 1965年&#xff0c;美國麻省理工學院&#xff08;MIT&#xff09;、通用電氣公司&#xff08;GE&#xff09;及AT&T的貝爾實驗室聯合開發Multics工程計劃&#xff0c;其目標是開發一種交互式的具有多道程序處理能力的分時操作系統&#xff0c;但因Multics追…

尼爾機器人技能快捷鍵_《尼爾機械紀元》連招操作技巧

《尼爾機械紀元》中的每個角色都可以裝備一個輕武器和一個重武器&#xff0c;技能招式也很豐富&#xff0c;下面為大家帶來了《尼爾機械紀元》連招操作技巧&#xff0c;希望對你們有所幫助。連擊技能展示視頻視頻原址&#xff1a;點擊進入基本沒有什么太難的連段&#xff0c;只…

保姆級教學!Xcode 配置 OpenGL 環境

文章目錄GLFW獲取 GLFWGLAD獲取 GLAD在 Xcode 中配置下載好的 GLFW 和 GLAD配置流程檢測是否配置成功無關配置的題外話——Xcode 下安全的刪除移動操作GLFW Graphics Library Framework&#xff08;圖形庫框架&#xff09;&#xff0c;可以讓我們通過其封裝好的 通用API 來正確…

Android入門(17)| 百度提供的 Android定位SDK

文章目錄配置百度提供的 Android定位SDK用于發布的 SHA1用于測試的 SHA1使用百度定位實例配置百度提供的 Android定位SDK 詳情參見官方文檔&#xff0c;這里僅對獲取 SHA1 做詳細介紹&#xff1a; 用于發布的 SHA1 用于測試的 SHA1 使用百度定位實例 public class LocationAc…

ios 不被遮擋 陰影_為何你沒見到日環食?你不知道的天象常識原來還有這么多 | 返樸...

關注風云之聲提升思維層次導讀說好的日環食呢&#xff0c;為什么上周很多人只等到了日偏食?日食月食的時間和種類是怎么預測的?你真的弄懂了各種日食和月食的成因嗎&#xff1f;你了解它們有什么區別和聯系&#xff0c;又遵循什么樣的時間規律嗎? 日食和月食發生的頻率一樣嗎…

初識貝塞爾(bezier)曲線

文章目錄資料援引貝塞爾曲線的用途一階貝塞爾&#xff08;bezier&#xff09;曲線二階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾&#xff08;bezier&#xff09;曲線高階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾曲線求插值&#xff08;Slerp&#xff09…

python代碼測試 vim_用 Hypothesis 快速測試你的 Python 代碼

點擊上方“Python編程時光”&#xff0c;選擇“加為星標”第一時間關注Python技術干貨&#xff01;介紹無論你使用哪種編程語言或框架&#xff0c;測試都非常重要。Hypothesis是 Python 的一個高級測試庫。它允許編寫測試用例時參數化&#xff0c;然后生成使測試失敗的簡單易懂…

Mac 下 CMake 的配置與使用

文章目錄安裝與配置編譯單個源文件編譯前的準備開始編譯編譯多個源文件多個源文件在同一目錄下多個源文件在不同目錄下math 目錄下的 CMakeLists.txt根目錄的 CMakeLists.txtoption 選項導入外部庫本地導入&#xff08;find_package&#xff09;外部導入&#xff08;FetchConte…

五軸編程_沙井萬豐數控數控編程五軸編程那個軟件好用

沙井萬豐數控數控編程五軸編程那個軟件好用設計需要掌握很高很全面的知識和技能&#xff0c;模具做的好&#xff0c;產品質量好&#xff0c;模具結構合理&#xff0c;生產效率高&#xff0c;工廠效益好。正因如此&#xff0c;模具技術工在外打工的工資都非常的高。少則每月幾千…

Linux學習:第二章-Linux安裝

一虛擬機使用 VMware主要特點&#xff1a; 1、不需要分區或重新開機就能在同一臺PC上使用兩種以上的操作系統 2、本機系統可以與虛擬機系統網絡通信 3、可以設定并且隨時修改虛擬機操作系統的硬件環境 二安裝方式 圖形安裝&#xff1a;直接回車 字符安裝&#xff1a;linux tex…

keil3如何放大字體_國潮海報不會做?送你國風字體+圖案筆刷+PSD素材+包裝樣機...

有很多朋友都問帶魚&#xff0c;國潮風的海報到底應該怎么做呢&#xff1f;首先你要知道什么是國潮風&#xff1a;國潮風就是現代文化和古代文化的碰撞&#xff0c;是年輕人的態度&#xff01;那么應該如何構圖如何設計呢&#xff1f;如何配色如何搭配字體呢&#xff1f;這些方…

Google 開源項目風格指南學習筆記——C++篇

文章目錄前言0. 縮寫名詞解釋1. 頭文件1.1. Self-contained 頭文件1.2. 頭文件保護1.3. 前置聲明1.4 內聯函數1.5. #include 的路徑及順序2. 作用域2.1. 命名空間2.2. 非成員函數、靜態成員函數和全局函數2.3. 局部變量2.4. 靜態和全局變量3. 類3.1. 構造函數的職責3.2. 隱式類…