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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android基础——网络编程

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

網絡編程

  • 網絡編程是什么?
  • WebView
  • HttpURLConnection訪問網絡
  • HttpURLConnection最佳用法

網絡編程是什么?

網絡編程指Android系統使用http協議和服務器交互,以傳輸或獲取相關數據。

WebView

Web控件可以讓我們在應用程序中嵌入瀏覽器,展示網頁信息。

修改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>

聲明權限:

<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訪問網絡

修改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>

聲明權限:

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

修改MainActivity

  • 通過構造函數創建URL實例,傳入待訪問的地址
  • 調用openConnection()方法獲取HttpURLConnection實例,設置相關參數
  • 通過getInputStream()方法獲取到返回的數據流并讀取解析
  • 調用disconnect()關閉連接
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);}});} }

若要向服務器提交數據,則使用POST:

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

Tips:

  • Android不允許在子線程中進行UI操作,需要調用runOnUiThread()方法將線程切換到主線程
  • Android28以后不允許明文訪問網址,可在Mainfest的application設置android:usesCleartextTraffic=“true” 或設置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最佳用法

    一個程序可能在很多地方都需要用到網絡,而請求網絡的代碼是相同的,為避免重復書寫代碼,我們可以將這部分代碼抽出來作為工具類HttpURLConnectionUtil,當需要訪問網絡時輸入地址即可返回數據:

    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:

  • 網絡屬于耗時操作,但sendHttpRequest()方法內并沒有開啟線程,這樣有可能被主線程阻塞
  • 但如果在sendHttpRequest()方法內開啟線程,可能在服務器還沒來得及響應,方法就已經結束了,導致數據無法返回
  • 子線程無法通過return返回數據
  • 解決辦法是利用回調機制,定義接口:

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

    修改HttpURLConnectionUtil,加入HttpURLConnectionCallback作為參數:

    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();} }

    當使用時,通過onFinish()方法返回數據,onError()方法處理異常:

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

    此外,還可以使用開源庫OkHttp訪問網絡.

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。