最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android入門之使用OKHttp組件訪問網絡資源

 更新時間:2022年12月26日 16:23:42   作者:TGITCIC  
這篇文章主要為大家詳細介紹了Android如何使用OKHttp組件訪問網絡資源功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下

簡介

今天的課程開始進入高級課程類了,我們要開始接觸網絡協(xié)議、設備等領域編程了。在今天的課程里我們會使用OKHttp組件來訪問網絡資源而不是使用Android自帶的URLConnection。一個是OKHttp組件更方便二個是OKHttp組件本身就帶有異步回調功能。

下面就進入課程。

課程目標

我們的課程目標有4個點:

  • 使用OKHttp組件;
  • 使用OKHttp組件加載網絡圖片顯示在APP的ImgView里;
  • 使用OKHttp組件加載給定網頁代碼顯示在ScrollView里;
  • 使用OKHttp組件加載給定網頁顯示在WebView里;

以上過程都為異步加載。

代碼前在gradle里要先聲明對于OKHttp組件的引用

要使用OKHttp組件,我們必須要在build.gradle中加入以下語句:

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

以下是加完上述語句后的build.gradle。

訪問網絡資源需要給到APP以權限

我們因為要訪問網絡資源,因此我們需要給到APP以相應的權限。編輯AndroidManifest.xml文件,并加入以下兩行聲明。

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

加完后的AndroidManifest.xml長這樣

代碼

菜單res\menu\pop_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menuItemDisplayPic" android:title="加載圖片" />
    <item android:id="@+id/menuItemDisplayHtmlCode" android:title="加載網頁代碼" />
    <item android:id="@+id/menuItemDisplayHtmlPage" android:title="加載網頁" />
</menu>

主UI界面

<?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">
 
    <Button
        android:id="@+id/buttonShowMenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textColor"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="展示彈出菜單" />
 
    <ImageView
        android:id="@+id/imgPic"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />
 
    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone">
 
        <TextView
            android:id="@+id/htmlTxt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </ScrollView>
    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
</LinearLayout>

MainActivity

package org.mk.android.demo.http;
 
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.ScrollView;
import android.widget.TextView;
 
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import okhttp3.OkHttpClient;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
public class MainActivity extends AppCompatActivity {
 
    private String TAG = "DemoOkHttp";
    private Button buttonShowMenu;
    private TextView htmlTxt;
    private ImageView imgPic;
    private WebView webView;
    private ScrollView scroll;
    private Bitmap bitmap;
    private String htmlContents;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonShowMenu = (Button) findViewById(R.id.buttonShowMenu);
        htmlTxt = (TextView) findViewById(R.id.htmlTxt);
        imgPic = (ImageView) findViewById(R.id.imgPic);
        webView = (WebView) findViewById(R.id.webView);
        scroll = (ScrollView) findViewById(R.id.scroll);
        buttonShowMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                PopupMenu popup = new PopupMenu(MainActivity.this, buttonShowMenu);
                popup.getMenuInflater().inflate(R.menu.pop_menu, popup.getMenu());
                popup.setOnMenuItemClickListener(new MenuItemClick());
                popup.show();
            }
        });
    }
 
    // 定義一個隱藏所有控件的方法:
    private void hideAllWidget() {
        imgPic.setVisibility(View.GONE);
        scroll.setVisibility(View.GONE);
        webView.setVisibility(View.GONE);
    }
 
    private class MenuItemClick implements PopupMenu.OnMenuItemClickListener {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            String imgPath = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.alicdn.com%2Fi2%2F2542318073%2FO1CN01fJvTi029VTwR16EvP_%21%212542318073.jpg&refer=http%3A%2F%2Fimg.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1673938156&t=69e5ee87fbf4b81b5f6eea53ed5b5158";
            String htmlPagePath = "https://www.baidu.com";
            switch (item.getItemId()) {
                case R.id.menuItemDisplayPic:
                    downLoadImgFromPath(imgPath);
                    break;
                case R.id.menuItemDisplayHtmlCode:
                    getHtmlAsync(htmlPagePath, 102);
                    break;
                case R.id.menuItemDisplayHtmlPage:
                    getHtmlAsync(htmlPagePath, 103);
 
                    break;
            }
            return true;
        }
    }
 
    private Handler httpHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {
            Log.i(TAG, ">>>>>>receive handler Message msg.what is: " + msg.what);
            switch (msg.what) {
                case 101:
                    hideAllWidget();
                    imgPic.setVisibility(View.VISIBLE);
                    Log.i(TAG, "begin to show img from bitmap type's data");
                    imgPic.setImageBitmap(bitmap);
                    break;
                case 102:
                    hideAllWidget();
                    Log.i(TAG, "begin to show html contents");
                    scroll.setVisibility(View.VISIBLE);
                    Log.d(TAG, ">>>>>>htmlContents->\n" + htmlContents);
                    htmlTxt.setText(htmlContents);
                    break;
                case 103:
                    hideAllWidget();
                    Log.i(TAG, "begin to show html page in webview");
                    webView.setVisibility(View.VISIBLE);
                    Log.d(TAG, ">>>>>>htmlContents->\n" + htmlContents);
                    webView.loadDataWithBaseURL("", htmlContents, "text/html", "UTF-8", "");
                    break;
            }
            return false;
        }
    });
    /**
     * 使用okhttp 異步下載圖片
     */
    private void downLoadImgFromPath(String path) {
 
        OkHttpClient client = new OkHttpClient();
 
        Request request = new Request.Builder()
                .url(path)
                .build();
        Log.i(TAG, ">>>>>>into doanloadImgFromPath method");
        try {
            Call call = client.newCall(request); // 使用client去請求
 
            call.enqueue(new Callback() { // 回調方法,>>> 可以獲得請求結果信息
                InputStream inputStream = null;
 
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, ">>>>>>下載失敗", e);
                }
 
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.i(TAG, ">>>>>>into onResponse method");
                    try {
                        inputStream = response.body().byteStream();
                        Log.i(TAG, ">>>>>>the response code is: " + response.code());
                        if (200 == response.code()) {
                            bitmap = BitmapFactory.decodeStream(inputStream);
                            Log.i(TAG, ">>>>>>sendEmptyMessage 101 to handler");
                            httpHandler.sendEmptyMessage(101);
                        } else {
                            Log.i(TAG, ">>>>>>下載失敗");
                        }
                    } catch (Exception e) {
                        Log.e(TAG, ">>>>>>okHttp onResponse error: " + e.getMessage(), e);
                    } finally {
                        try {
                            inputStream.close();
                        } catch (Exception e) {
                        }
                    }
                }
            });
 
        } catch (Exception e) {
            Log.e(TAG, ">>>>>>OkHttp調用失敗", e);
        }
    }
 
    //異步不需要創(chuàng)建線程
    private void getHtmlAsync(String path, int handlerCode) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(path).build();
        //請求的call對象
        Call call = client.newCall(request);
        //異步請求
        call.enqueue(new Callback() {
 
            //失敗的請求
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Log.e(TAG, ">>>>>>加載path失敗", e);
            }
 
            //結束的回調
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                //響應碼可能是404也可能是200都會走這個方法
                Log.i(TAG, ">>>>>>the response code is: " + response.code());
                if (200 == response.code()) {
                    try {
                        ResponseBody responseBody = response.body();
                        BufferedSource source = responseBody.source();
                        source.request(Long.MAX_VALUE);
                        Buffer buffer = source.buffer();
                        Charset UTF8 = Charset.forName("UTF-8");
                        htmlContents = buffer.clone().readString(UTF8);
                        Log.i(TAG, ">>>>>>sendEmptyMessage " + handlerCode + " to handler");
                        httpHandler.sendEmptyMessage(handlerCode);
                        Log.i(TAG, "getAsyncHtmlGet成功");
                    } catch (Exception e) {
                        Log.e(TAG, ">>>>>>read htmlPage error: " + e.getMessage(), e);
                    }
                }
            }
        });
    }
}

核心代碼導讀

我們使用的是

Call call = client.newCall(request);

它本身就是支持異步的一個調用。 然后在得到相應的Http報文后使用一個Handler向APP主界面發(fā)起改變界面中內容的調用。

這邊有一點需要注意的是OKHttp在返回的response.body()這個API,在一次請求里只能被使用一次。即如果你已經有以下一句類似的調用:

inputStream = response.body().byteStream();

你就不能再在它以下的語句中調用一次response.body()了。

自己動一下手試試看效果吧。

到此這篇關于Android入門之使用OKHttp組件訪問網絡資源的文章就介紹到這了,更多相關Android OKHttp訪問網絡資源內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android MPAndroidChart開源圖表庫之餅狀圖的代碼

    Android MPAndroidChart開源圖表庫之餅狀圖的代碼

    MPAndroidChart是一款基于Android的開源圖表庫,MPAndroidChart不僅可以在Android設備上繪制各種統(tǒng)計圖表,而且可以對圖表進行拖動和縮放操作,應用起來非常靈活
    2018-05-05
  • Android Gradle多渠道打包的實現方法

    Android Gradle多渠道打包的實現方法

    這篇文章主要介紹了Android Gradle多渠道打包的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Android 利用反射+try catch實現sdk按需引入依賴庫的方法

    Android 利用反射+try catch實現sdk按需引入依賴庫的方法

    這篇文章主要介紹了Android 利用反射+try catch來實現sdk按需引入依賴庫,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Android?線程死鎖場景與優(yōu)化解決

    Android?線程死鎖場景與優(yōu)化解決

    線程死鎖是老生常談的問題,線程池死鎖本質上屬于線程死鎖的一部分,線程池造成的死鎖問題往往和業(yè)務場景相關,本文主要介紹了Android?線程死鎖場景與優(yōu)化,感興趣的可以了解一下
    2023-12-12
  • Android實戰(zhàn)教程第九篇之短信高效備份

    Android實戰(zhàn)教程第九篇之短信高效備份

    這篇文章主要為大家詳細介紹了Android實戰(zhàn)教程第九篇之短信高效備份,利用xml序列化器備份短信,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android開發(fā)使用Activity嵌套多個Fragment實現橫豎屏切換功能的方法

    Android開發(fā)使用Activity嵌套多個Fragment實現橫豎屏切換功能的方法

    這篇文章主要介紹了Android開發(fā)使用Activity嵌套多個Fragment實現橫豎屏切換功能的方法,結合實例形式分析了Android使用Activity嵌套多個Fragment進行橫豎屏切換的原理與具體操作技巧,需要的朋友可以參考下
    2017-11-11
  • Android中Fragment的分屏顯示處理橫豎屏顯示的實現方法

    Android中Fragment的分屏顯示處理橫豎屏顯示的實現方法

    今天小編就為大家分享一篇關于Android中Fragment的分屏顯示處理橫豎屏顯示的實現方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Android之AttributeSet案例詳解

    Android之AttributeSet案例詳解

    這篇文章主要介紹了Android之AttributeSet案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Android 播放視頻常見問題小結

    Android 播放視頻常見問題小結

    這篇文章主要介紹了Android 播放視頻常見問題小結,需要的朋友可以參考下
    2017-04-04
  • Android?Studio實現簡單頁面跳轉的詳細教程

    Android?Studio實現簡單頁面跳轉的詳細教程

    這篇文章主要給大家介紹了關于Android?Studio實現簡單頁面跳轉的詳細教程,文中通過圖文介紹的非常詳細,對大家學習或者使用Android?Studio具有一定的參考學習價值,需要的朋友可以參考下
    2023-01-01

最新評論

乐陵市| 江北区| 钦州市| 客服| 崇礼县| 清苑县| 电白县| 江津市| 湖州市| 泸西县| 南康市| 松潘县| 乌兰浩特市| 无为县| 凉山| 塔河县| 文登市| 珠海市| 临桂县| 鱼台县| 柳江县| 五莲县| 清水河县| 昌图县| 花莲县| 安西县| 布拖县| 烟台市| 内黄县| 鹤山市| 关岭| 建瓯市| 墨玉县| 田东县| 响水县| 全州县| 贵南县| 广昌县| 湟源县| 湖口县| 青岛市|