今天聽得有點蒙,因為服務器的問題,這邊建立服務器的話,學長用的是Idea建立的Spring之類的方法去搞服務器。
然后就是用Android去給這個服務器發送請求,大致效果還是懂的,就是像網站發送請求,然后登錄網站。
我們用http協議訪問網絡:
它的工作原理特別簡單,就是客戶端向服務器發出一條 HTTP請求,服 務器收到請求之后會返回一些數據給客戶端,然后客戶端再對這些數據進行解析和處理就可以了。
我們主要用的是HttpURLConnection請求。
我們連接網絡得如下寫法:下面選擇的第一句就是連接網絡,第三句是使用明文流量,
什么是 android:usesCleartextTraffic
android:usesCleartextTraffic 指示應用程序是否打算使用明文網絡流量,例如明文HTTP。目標API級別為27或更低的應用程序的默認值為“ true”。面向API級別28或更高級別的應用默認為“ false”。
當屬性設置為“ false”時,平台組件(例如,HTTP和FTP堆棧,DownloadManager和MediaPlayer)將拒絕應用程序使用明文流量的請求。強烈建議第三方庫也采用此設置。避免明文通信的主要原因是缺乏機密性,真實性和防篡改保護;網絡攻擊者可以竊聽所傳輸的數據,並且還可以對其進行修改而不會被檢測到。
大概意思就是安全性的問題,我認為還是必須得寫的。
我們可以先寫個活動,連接到百度,發送請求並獲取百度的信息:
這里面的句柄(handler)可以忽略不看,
至於handler是啥,大牛的網站獻上:
https://blog.csdn.net/zjpp2580369/article/details/81290620
handler.post()其實和runOnUiThread的功能差不多,讓子線程連接到主線程。
請求的話我們一般的固定寫法就是先:
URL url = new URL("http://www.baidu.com");//它會報異常,抓一下或者拋都行。
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //這一步就是發送http請求。
我們寫這個就是為了在服務器上獲取數據,所以我們用post。
接着因為要獲取,得調用輸入流,把網站傳過來的數據用字節形式存下來
這是學java的字節IO流的固定套路,就是循環讀入數組,接着就是根據
數組放入String變量里,從0-len意思就是全部讀入。
最后吧信息寫到message文本控件里
。那么這里為什么要用這個 runOnUiThread()方法呢?
這是因為 Android是不允許在子線程中進行 UI操作的,我們需要通過這個方法將線程切換到主線程,然后 再更新 UI 元素。不過我們現在並沒有操作很多東西,就沒在里面寫內容了。
最后說一下為啥要新建個線程,因為網絡這塊好像不能在主線程里寫。所以要新建一個線程,而我們UI操作卻要到主線程里,所以切換到主線程的時候得想到runOnUiThread;
我們的布局也不貼了,就是一個文本控件,然后在活動得到信息。
最后就是得到一個百度的html代碼;
上代碼:先上布局,布局用ScrollView:
因為我們要用請求得到網站的東西可能會很多,一頁看不完。
上邊是寫個登錄的界面,上活動:
看起來挺復雜的。
這個活動里的OnCreate里還是挺簡單的,就是連接布局並連接控件。
我們連接控件並且調用自己寫的登錄方法,
請求的話我們一般的固定寫法就是先:
URL url = new URL("http://www.baidu.com");//它會報異常,抓一下或者拋都行。
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //這一步就是發送http請求。
這種寫法,學長寫的地址是測試自己寫的服務器的,不過10.0.2.2是哪個地址?
因為模擬器和安卓使用的本地ip不是計算機的127.0.0.1,它是自己自帶的地址,我們如果寫localhost或者回路地址的話是找不到的,后面的兩個是服務器里寫的參數,我們相當於調用了個方法,把參數傳過去。
我們還可以用很多連接時對網站的定制方法,比如請求的方式:
connection.setRequestMethod("GET"); //獲取網站的信息,好像是默認的,post就是提交信息上去。
connection.setConnectTimeout(8000);//這兩個分別是連接超時和讀取超時,都是毫秒。
connection.setReadTimeout(8000);
我們寫這個就是為了在服務器上獲取數據,所以我們用post。
接着因為要獲取,得調用輸入流,把網站傳過來的數據用字節形式存下來
這是學java的字節IO流的固定套路,就是循環讀入數組,接着就是根據
數組放入String變量里,從0-len意思就是全部讀入。
最后吧信息寫到message文本控件里
。那么這里為什么要用這個 runOnUiThread()方法呢?
這是因為 Android是不允許在子線程中進行 UI操作的,我們需要通過這個方法將線程切換到主線程,然后 再更新 UI 元素。不過我們現在並沒有操作很多東西,就沒在里面寫內容了。
最后說一下為啥要新建個線程,因為網絡這塊好像不能在主線程里寫。所以要新建一個線程,而我們UI操作卻要到主線程里,所以切換到主線程的時候得想到runOnUiThread;
總結:主要是理解Android請求網絡的步驟和方法,以及一些基礎步驟的運行。