日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android基础——网络编程

發(fā)布時(shí)間:2024/1/18 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android基础——网络编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)絡(luò)編程

  • 網(wǎng)絡(luò)編程是什么?
  • WebView
  • HttpURLConnection訪問網(wǎng)絡(luò)
  • HttpURLConnection最佳用法

網(wǎng)絡(luò)編程是什么?

網(wǎng)絡(luò)編程指Android系統(tǒng)使用http協(xié)議和服務(wù)器交互,以傳輸或獲取相關(guān)數(shù)據(jù)。

WebView

Web控件可以讓我們?cè)趹?yīng)用程序中嵌入瀏覽器,展示網(wǎng)頁信息。

修改activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"tools:context=".MainActivity"><WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

聲明權(quán)限:

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

修改MainActivity:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);WebView webView=findViewById(R.id.web_view);webView.getSettings().setJavaScriptEnabled(true);webView.setWebViewClient(new WebViewClient());webView.loadUrl("https://www.baidu.com");} }

HttpURLConnection訪問網(wǎng)絡(luò)

修改activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/send_request"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="send_request" /><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>

聲明權(quán)限:

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

修改MainActivity

  • 通過構(gòu)造函數(shù)創(chuàng)建URL實(shí)例,傳入待訪問的地址
  • 調(diào)用openConnection()方法獲取HttpURLConnection實(shí)例,設(shè)置相關(guān)參數(shù)
  • 通過getInputStream()方法獲取到返回的數(shù)據(jù)流并讀取解析
  • 調(diào)用disconnect()關(guān)閉連接
public class MainActivity extends AppCompatActivity {private TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);responseText = findViewById(R.id.response_text);Button sendRequest = findViewById(R.id.send_request);sendRequest.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {sendRequestWithHttpURLConnection();}});}private void sendRequestWithHttpURLConnection() {new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try {URL url = new URL("https://www.baidu.com");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream inputStream = connection.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}showResponse(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();}private void showResponse(final String toString) {runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(toString);}});} }

若要向服務(wù)器提交數(shù)據(jù),則使用POST:

connection.setRequestMethod("POST"); DataOutputStream outputStream=new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes("username=admin&password=123456");

Tips:

  • Android不允許在子線程中進(jìn)行UI操作,需要調(diào)用runOnUiThread()方法將線程切換到主線程
  • Android28以后不允許明文訪問網(wǎng)址,可在Mainfest的application設(shè)置android:usesCleartextTraffic=“true” 或設(shè)置networkSecurityConfig指定類似如下的配置文件
  • <?xml version="1.0" encoding="utf-8"?><network-security-config><domain-config cleartextTrafficPermitted="false"><domain includeSubdomains="true">secure.example.com</domain></domain-config></network-security-config>

    HttpURLConnection最佳用法

    一個(gè)程序可能在很多地方都需要用到網(wǎng)絡(luò),而請(qǐng)求網(wǎng)絡(luò)的代碼是相同的,為避免重復(fù)書寫代碼,我們可以將這部分代碼抽出來作為工具類HttpURLConnectionUtil,當(dāng)需要訪問網(wǎng)絡(luò)時(shí)輸入地址即可返回?cái)?shù)據(jù):

    public class HttpURLConnectionUtil {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 inputStream = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));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();}}} }

    Tips:

  • 網(wǎng)絡(luò)屬于耗時(shí)操作,但sendHttpRequest()方法內(nèi)并沒有開啟線程,這樣有可能被主線程阻塞
  • 但如果在sendHttpRequest()方法內(nèi)開啟線程,可能在服務(wù)器還沒來得及響應(yīng),方法就已經(jīng)結(jié)束了,導(dǎo)致數(shù)據(jù)無法返回
  • 子線程無法通過return返回?cái)?shù)據(jù)
  • 解決辦法是利用回調(diào)機(jī)制,定義接口:

    public interface HttpURLConnectionCallback {void onFinish(String response);void onError(Exception e); }

    修改HttpURLConnectionUtil,加入HttpURLConnectionCallback作為參數(shù):

    public class HttpURLConnectionUtil {public static void sendHttpRequest(final String address, final HttpURLConnectionCallback callback) {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 inputStream = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}if (callback != null) {callback.onFinish(response.toString());}} catch (Exception e) {if (callback != null) {callback.onError(e);}} finally {if (connection != null) {connection.disconnect();}}}}).start();} }

    當(dāng)使用時(shí),通過onFinish()方法返回?cái)?shù)據(jù),onError()方法處理異常:

    HttpURLConnectionUtil.sendHttpRequest("https://www.baidu.com", new HttpURLConnectionCallback() {@Overridepublic void onFinish(String response) {}@Overridepublic void onError(Exception e) {}});

    此外,還可以使用開源庫(kù)OkHttp訪問網(wǎng)絡(luò).

    總結(jié)

    以上是生活随笔為你收集整理的Android基础——网络编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。