国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android網(wǎng)絡(luò)編程,HTTP請求和Json解析

這篇具有很好參考價值的文章主要介紹了Android網(wǎng)絡(luò)編程,HTTP請求和Json解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一. 基本網(wǎng)絡(luò)請求類HttpURLConnection

以下代碼模擬了點擊按鈕請求百度的網(wǎng)頁源碼:其中需要注意的是Android在API27之后不再支持明文訪問HTTP,需要在manifest文件中配置屬性允許使用明文訪問,并且Url需要使用https

layout.xml

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

    <Button
        android:id="@+id/web_btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="點擊獲取百度頁面"
        android:textSize="20sp"
        android:layout_marginBottom="5dp"
        android:onClick="getHttpText"/>
<!--<WebView-->
<!--        android:id="@+id/webview1"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"></WebView>-->

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/web_tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />


    </ScrollView>

</LinearLayout>

字節(jié)流轉(zhuǎn)換字符串工具類:

public class HttpInputStreamParse {

    public static String parseInput(InputStream in) throws IOException {

        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String temp;
        while((temp = br.readLine())!= null){
            sb.append(temp);
        }
        return sb.toString();
    }
}

主類.java:

public class MainActivity extends AppCompatActivity {

    private static final String HTTP_ADDRESS = "https://www.baidu.com";
    private TextView tv1;
    private WebView wb1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = findViewById(R.id.web_tv1);
        //wb1 = findViewById(R.id.webview1);
    }

    public void getHttpText(View view) {
//        wb1.loadUrl(HTTP_ADDRESS);
//        wb1.setWebViewClient(new WebViewClient(){
//            @Override
//            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//                view.loadUrl(url);
//                return true;
//            }
//        });
new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(HTTP_ADDRESS);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    connection.connect();
                    int code = connection.getResponseCode();
                    if (code != HttpURLConnection.HTTP_OK) {
                        Log.d("NETWORK",code+"");
                    }// 200;

                    InputStream inputStream = connection.getInputStream();
                    final String rec = HttpInputStreamParse.parseInput(inputStream);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tv1.setText(rec);
                        }
                    });//這里使用handler也可以與主線程通信
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

配置manifest.xml文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.hait.cs.networkdemo">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.NetworkDemo"
        android:usesCleartextTraffic="true"
        >
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

二. 使用webveiw控件

將上述代碼中的webview相關(guān)內(nèi)容解除注釋即可得到一個顯示的網(wǎng)頁,webview的內(nèi)容顯示會將下方源碼擠出布局空間。

同時可以使用webview處理添加html和JavaScript文件,這里不再贅述。

三. Json解析

可以在AS中的main文件夾下生成assets文件夾注意不要寫錯,將Json數(shù)據(jù)添加至此(在assets文件夾下新建文件后綴xxx.json即可),調(diào)用this.getResources().getAssets().open("json路徑名")獲得一個InputStream對象,轉(zhuǎn)成字符串后可以調(diào)用JSONObject對象的optXXX()方法解析Json中的key值從而得到value的值,需要注意數(shù)據(jù)類型。

json對象:

{
  "name": "張三",
  "age" : 24,
  "married":false
}

json對象數(shù)組

[
  {"name": "張三",
    "age" : 24,
    "married":false
  },
  {"name": "阿珍",
    "age" : 25,
    "married":true
  },
  {"name": "阿強",
    "age" : 26,
    "married":true
  }
]

其中json對象中的屬性可以是一個json對象,例如添加屬性”address“,其可以是一個json對象包含省,市,區(qū)等多個屬性

除此之外,json對象的屬性也可以是一個數(shù)組,例如屬性"hobby"可以是[ 唱、跳、rap、籃球 ]

可以使用一些軟件模擬在線的json請求,例如postman和apipost等。

以下代碼演示了如何解析一個json對象,布局文件省略,大致是點擊按鈕,解析asset文件夾下的一個json對象文件,將解析結(jié)果用textview展示出來。

主類.java

public class JsonParseActivity extends AppCompatActivity {

    private TextView tv1;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_json_parse);
        tv1 = findViewById(R.id.json_tv1);
    }

    public void parseJson(View view) {
        try {
            InputStream open = this.getResources().getAssets().open("weather.json");
            String json = HttpInputStreamParse.parseInput(open);

            JSONObject jsonObject = new JSONObject(json);

            String name = jsonObject.optString("name");
            int age = jsonObject.optInt("age");
            String married = jsonObject.optString("married");

            tv1.setText(name+":"+age+":"+married);
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }


    }
}

解析Json數(shù)組:使用JsonArray獲取輸入流,之后遍歷數(shù)組即可

parseJsons方法

public void parseJsons(View view) {
       try {
           InputStream open = this.getResources().getAssets().open("persons.json");
           String jsons = HttpInputStreamParse.parseInput(open);
           JSONArray jsonArray = new JSONArray(jsons);
           StringBuilder sb = new StringBuilder();
           for (int i = 0; i< jsonArray.length();i++){
               JSONObject jsonObject = jsonArray.getJSONObject(i);
               String name = jsonObject.optString("name");
               int age = jsonObject.optInt("age");
               String married = jsonObject.optString("married");
               sb.append(name+":"+age+":"+married);
               sb.append("\n");
           }
           tv2.setText(sb.toString());


       } catch (IOException | JSONException e) {
           e.printStackTrace();
       }
   }

四. 使用 Gson解析

使用google開發(fā)的第三方庫Gson來解析json文件。

添加Gson依賴:選擇module,open module settings,dependencies,添加依賴,輸入關(guān)鍵字gson*添加對應(yīng)版本的依賴庫。

Gson解析時可以直接將json字符串轉(zhuǎn)換為一個實體類對象,因此可以創(chuàng)建一個pojo包,將待解析的json文件按照對應(yīng)屬性來創(chuàng)建java bean類。

這里可以選擇添加插件 gsonformat 或 gsonformat plus,在file選項卡下的settings內(nèi)選擇plugin選項卡搜索對應(yīng)插件安裝即可(mac os選擇 Android Studio選項卡下的preference選項,選擇plugin并搜索)。

pojo java bean: PersonBean.java

public class PersonBean {

    private String name;
    private int age;
    private boolean married;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
public void setAge(int age) {
        this.age = age;
    }

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }
}

使用gson解析json對象:直接給按鈕寫響應(yīng),在布局中構(gòu)建onClick響應(yīng)函數(shù)parseGson,在主類中創(chuàng)造此方法。

 public void parseGson(View view) {

        try {
            Gson gson = new Gson();
            InputStream open = this.getResources().getAssets().open("weather.json");
            String json = HttpInputStreamParse.parseInput(open);
            PersonBean personBean = gson.fromJson(json, PersonBean.class);
            String name = personBean.getName();
            String age = String.valueOf(personBean.getAge());
            String married = String.valueOf(personBean.isMarried());
            tv1.setText(name+":"+age+":"+married);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

上述做法直接轉(zhuǎn)換為類對象

使用gson解析json數(shù)組:直接給按鈕寫響應(yīng),在布局中構(gòu)建onClick響應(yīng)函數(shù)parseGsons,在主類中創(chuàng)造此方法。

public void parseGsons(View view) {
        try {
            InputStream open = this.getResources().getAssets().open("persons.json");
            String json = HttpInputStreamParse.parseInput(open);
            Gson gson = new Gson();
            Type type = new TypeToken<List<PersonBean>>(){}.getType();
            List<PersonBean> personList = gson.fromJson(json, type);
            StringBuilder sb = new StringBuilder();
            for (PersonBean pb:personList){
                String name = pb.getName();
                String age = String.valueOf(pb.getAge());
                String married = String.valueOf(pb.isMarried());
                sb.append(name+":"+age+":"+married);
                sb.append("\n");
            }
            tv2.setText(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

上述代碼關(guān)鍵語句在構(gòu)建type對象,new出TypeToken的實例獲取type對象,將json數(shù)組轉(zhuǎn)成javabean泛型的集合。最后遍歷集合進行操作即可。
附加問題:更加復(fù)雜的json文件進行解析,例如json文件:

[
  {
    "name": "zhangsan",
    "age": 18,
    "married": false,
    "zhifubao": {
      "account": "zhangsan",
      "balance": 10000
    },
    "hobby": ["sing","dance","basketball"]
  },
  {
    "name": "lisi",
    "age": 19,
    "married": false,
    "zhifubao": {
      "account": "lisi",
      "balance": 20000
    },
    "hobby": ["idol","rap","walking-dead"]
  }
]

上述文件是一個json數(shù)組,數(shù)組內(nèi)兩個json對象,其中json對象中屬性“zhifubao”又是一個json對象,且屬性“hobby”是一個json數(shù)組。

解析上述文件時,可參考插件自動構(gòu)建javabean,外圍的json數(shù)組一定是一個集合,集合內(nèi)對象類型為javabean,每一個javabean類中有各種屬性,對于復(fù)雜屬性“zhifubao”,可將其再次構(gòu)建javabean,內(nèi)有屬性“account”,“balance”。相當(dāng)于構(gòu)建支付寶實體類。對于復(fù)雜屬性“hobby”,其數(shù)據(jù)類型為一個字符串集合。文章來源地址http://www.zghlxwxcb.cn/news/detail-408555.html

到了這里,關(guān)于Android網(wǎng)絡(luò)編程,HTTP請求和Json解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android設(shè)置app開機自啟,網(wǎng)絡(luò)監(jiān)聽,主線程完成UI渲染,HTTP網(wǎng)絡(luò)請求工具,json數(shù)據(jù)處理,android使用sqlite,Android定時任務(wù),日志打印

    在AndroidManifest.xml文件中添加權(quán)限 在AndroidManifest.xml文件中注冊接收廣播配置, 添加到manifest application節(jié)點下 在AndroidManifest.xml文件中添加節(jié)點屬性, 指定安裝目錄為內(nèi)部存儲器, 而非SD卡 開機啟動執(zhí)行代碼 gson是谷歌… implementation ‘gson-2.8.5’ 依賴無法下載, 直接使用jar包, 將ja

    2024年02月03日
    瀏覽(22)
  • Go語言網(wǎng)絡(luò)編程(socket編程)http編程

    Web服務(wù)器的工作原理可以簡單地歸納為 客戶機通過TCP/IP協(xié)議建立到服務(wù)器的TCP連接 客戶端向服務(wù)器發(fā)送HTTP協(xié)議請求包,請求服務(wù)器里的資源文檔 服務(wù)器向客戶機發(fā)送HTTP協(xié)議應(yīng)答包,如果請求的資源包含有動態(tài)語言的內(nèi)容,那么服務(wù)器會調(diào)用動態(tài)語言的解釋引擎負責(zé)處理“

    2024年02月09日
    瀏覽(94)
  • 網(wǎng)絡(luò)編程 tcp udp http編程流程 網(wǎng)絡(luò)基礎(chǔ)知識

    網(wǎng)絡(luò)編程 tcp udp http編程流程 網(wǎng)絡(luò)基礎(chǔ)知識

    OSI分層:應(yīng)用層 表示層 會話層 傳輸層 網(wǎng)絡(luò)層 數(shù)據(jù)鏈路層 物理層 tcp/ip: 應(yīng)用層 傳輸層 網(wǎng)絡(luò)層 數(shù)據(jù)鏈路 ip地址:唯一標(biāo)識一臺主機 ipv4 32位 ipv6 128位 尋址 可以反映物理上的一個變化 MAC地址:48 固化在計算機中 ip地址又兩部分構(gòu)成:網(wǎng)絡(luò)號+主機號 端口號:標(biāo)識一個應(yīng)用程序

    2024年02月13日
    瀏覽(38)
  • 【Linux網(wǎng)絡(luò)編程】HTTP協(xié)議

    【Linux網(wǎng)絡(luò)編程】HTTP協(xié)議

    喜歡的點贊,收藏,關(guān)注一下把! 目前基本socket寫完,一般服務(wù)器設(shè)計原則和方式(多進程、多線程、線程池)+常見的各種場景,自定義協(xié)議+序列化和反序列化都已經(jīng)學(xué)過了。 那有沒有人已經(jīng)針對常見場景,早就已經(jīng)寫好了常見的協(xié)議軟件,供我們使用呢? 當(dāng)然了,最典型的

    2024年04月16日
    瀏覽(40)
  • 網(wǎng)絡(luò)編程 http 相關(guān)基礎(chǔ)概念

    網(wǎng)絡(luò)編程 http 相關(guān)基礎(chǔ)概念

    HTTP表單是一種用于在Web應(yīng)用程序中收集用戶輸入數(shù)據(jù)的機制。它由HTML表單元素和HTTP請求組成。 HTML表單元素(如、、等)用于創(chuàng)建用戶界面,讓用戶輸入數(shù)據(jù)。用戶可以在表單中填寫文本、選擇選項、上傳文件等。 當(dāng)用戶提交表單時,瀏覽器會將表單數(shù)據(jù)封裝在HTTP請求中,

    2024年02月11日
    瀏覽(23)
  • 【網(wǎng)絡(luò)編程】協(xié)議定制+Json序列化與反序列化

    【網(wǎng)絡(luò)編程】協(xié)議定制+Json序列化與反序列化

    需要云服務(wù)器等云產(chǎn)品來學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ? 目錄 一、序列化與反序列化的概念 二、自定義協(xié)議設(shè)計一個網(wǎng)絡(luò)計算器 2.1TCP協(xié)議,如何保證接收方收到了完整的報文呢?

    2024年02月06日
    瀏覽(25)
  • C#請求訪問HTTP+JSON數(shù)據(jù)的解析

    C#請求訪問HTTP+JSON數(shù)據(jù)的解析

    最近工作客戶需要一個HTTP的Mes需求,所以自己去學(xué)習(xí)了C#請求HTTP的方法以及JSON數(shù)據(jù)的解析方法,總結(jié)出了點經(jīng)驗,以便后續(xù)自己找起來方便一點,故在此寫一篇文章。 下面我用一個聚合數(shù)據(jù)提供的天氣預(yù)報API接口來闡述請求HTTP和JSON數(shù)據(jù)解析的功能; 先看API文檔這么訪問數(shù)

    2024年02月12日
    瀏覽(16)
  • ?悟透Qt—Http網(wǎng)絡(luò)編程

    ?悟透Qt—Http網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)訪問 API 建立在一個 QNetworkAccessManager 對象之上,該對象保存了發(fā)送請求所需的公共配置和設(shè)置。它包含代理和緩存配置,以及與此類問題相關(guān)的信號和可用于監(jiān)視網(wǎng)絡(luò)操作進度的回復(fù)信號。整個 Qt 應(yīng)用程序只需要一個 QNetworkAccessManager 實例。由于 QNetworkAccessManager 基于

    2024年02月11日
    瀏覽(27)
  • linux【網(wǎng)絡(luò)編程】之HTTP協(xié)議

    linux【網(wǎng)絡(luò)編程】之HTTP協(xié)議

    在上篇文章中我們模擬了一個應(yīng)用層協(xié)議,HTTP(超文本傳輸協(xié)議)就是其中之一。http就是通過http協(xié)議從服務(wù)器上讀取對應(yīng)的“資源”,這里所說的資源是在網(wǎng)絡(luò)上看到的一切都可以看成資源文件;訪問資源就是根據(jù)路徑,從服務(wù)器磁盤上拿取資源 平時我們俗稱的 “網(wǎng)址” 其

    2024年02月07日
    瀏覽(47)
  • Python中的網(wǎng)絡(luò)編程Socket與HTTP協(xié)議的實踐【第158篇—網(wǎng)絡(luò)編程】

    Python中的網(wǎng)絡(luò)編程Socket與HTTP協(xié)議的實踐【第158篇—網(wǎng)絡(luò)編程】

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!军c擊進入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 在當(dāng)今互聯(lián)網(wǎng)時代,網(wǎng)絡(luò)編程是程序員不可或缺的一項技能。Python作為一種高級編程語言,提供了豐富的網(wǎng)絡(luò)編程庫,使得開發(fā)者能夠輕松地

    2024年04月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包