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

歡迎訪問 生活随笔!

生活随笔

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

Android

android显示网络图片控件,Android控件之ImageView(二)

發布時間:2025/3/15 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android显示网络图片控件,Android控件之ImageView(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在上一篇文章中,我們講解了如何加載本地圖片,那么在實際項目中 ImageView 大多數使用場景是加載網絡圖片,網絡圖片其實就是存儲在服務器上的文件,我們需要從服務器獲取到文件的二進制輸入流 Inpustream ,然后將其轉化為 ImageView 可以加載的 Bitmap 對象。實現網絡圖片的加載。

這篇文章我們通過使用原始的網絡連接和使用第三庫來簡單講解 ImageView 網絡圖片的加載。

怎么使用原始方式加載網絡圖片?

第三方網絡圖片加載庫與原始加載庫的對比?

怎樣使用第三方網絡加載庫加載圖片?

使用原始方式加載網絡圖片

先上代碼(主要分為三大步驟):

1~6 : 從網絡獲取圖片。由于Android 系統規定網絡請求操作需要在子線程完成。主要是因為網絡請求屬于耗時操作,如果在主線程發起網絡請求會導致主線程在網絡請求期間,無法及時響應用戶的操作,

7:利用在 Activity聲明的 Handler對象把在子線從網絡獲取到的 Bitmap 對象,轉移到 UI 線程。

8 : 更新UI。

public class ImageNetActivity extends AppCompatActivity {

/**

* 7.要知道 這里現在是子線程 更新UI的操作需要在主線程(UI線程)完成。

* 在 Activity 中聲明 Handler 對象,并復寫它的 handleMessage 方法

*/

private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 1010) {

Bitmap bitmap = (Bitmap) msg.obj;

setImageView(bitmap);

}

}

};

private ImageView mImageView;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_image_net);

mImageView = findViewById(R.id.image);

loadImageUrl("https://cdn.pixabay.com/photo/2017/05/09/23/02/dog-2299482_960_720.jpg");

}

private void loadImageUrl(final String imageUrl) {

// Android 系統強制網絡請求需要在子線程操作

new Thread(new Runnable() {

@Override

public void run() {

InputStream inputStream = null;

try {

// 1. 把傳過來的路徑轉成URL

URL url = new URL(imageUrl);

// 2.通過URL 建立網絡連接

// --> url.openConnection() 返回 URLConnection

// ,它是一個抽象類,這里需要通過Http協議建立連接,需要它的實現類 HttpURLConnection

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

// 3. 使用GET方法訪問網絡

urlConnection.setRequestMethod("GET");

// 配置網絡超時時間為 10秒

urlConnection.setConnectTimeout(10000);

//4. 獲取Http協議 響應碼

int responseCode = urlConnection.getResponseCode();

// Http 協議 規定 響應碼為200時 請求成功

if (responseCode == 200) {

// 5. 得知 請求資源成功后,獲取圖片文件輸入流

inputStream = urlConnection.getInputStream();

// 6. 把獲取到的 文件輸入流 通過 系統Api 轉換為 ImageView 可以識別的 Bitmap 對象

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

// 7.要知道 這里現在是子線程 更新UI的操作需要再主線程(UI線程)完成。

Message message = mHandler.obtainMessage();

message.obj = bitmap;

message.what = 1010;//

mHandler.sendMessage(message);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (inputStream != null) {

try {

//關閉流

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}).start();

}

}

/**

* 8.利用從 Mesage 從子線程中攜帶回來的 Bitmap 對象,在UI線程設置圖片

*/

private void setImageView(Bitmap bitmap) {

mImageView.setImageBitmap(bitmap);

}

}

上面是創建一個空的 Activity ,布局文件中只有一個 ImageView 控件。

注意:在 Android中 主線程 也叫 UI線程。UI 線程是響應用戶操作的線程,一旦在 UI線程中存在好在操作,就會阻塞 UI 線程,導致無法及時響應用戶操作事件。所以在Android 系統 4.0 后,強制網絡請求操作必須在子線程。但問題是:所有更新 UI 的操作又必須在UI線程,這就是我們必須把網絡請求的結果,轉移到主線程才能更新 UI。怎么轉移呢? 那就是 Handler。這個現在知道怎么用就行,后面我們會仔細講解。

上面的代碼中,利用系統自帶 ULRConnection請求網絡請求的步驟注釋已經很詳細了。可仔細了解其網絡請求步驟,大致的套路是一樣的。

特別特別特別注意:網絡請求是需要權限的,你需要在?AndroidManifet.xml 文件中聲明一句用戶權限。至于權限的概念后面我們會細聊。現在只需要在AndroidManifet.xml文件申明即可。

第三方網絡圖片加載庫與原始加載庫的對比

我們來思考幾個問題,如果在真實項目中,我們這樣加載圖片你覺得可以嗎?

........

答案是:不可以。

問題1:上面就只單一使用了內存緩存來解決圖片加載問題,Android 系統為每個應用分配的內存是有限的,假如說我們的圖片成千上萬,即使現在的 Android 手機硬件都配置很高,也頂不住這樣的操作,當內存不足時應用馬上會崩潰(Crash)。

問題2:內存緩存,易失去性。即當你重新啟動應用程序后,原來已經加載過的圖片就會丟失,重啟后又會重新下載!這就會導致頁面加載緩慢,再次耗費用戶流量。

所以我們需要一個比較完善的圖片加載系統,這個系統最基礎的要包括圖片的緩存策略:先從網絡請求圖片,在手機內存中和SD卡中各自保存一份圖片資源。當重啟應用時,如果圖片存在SD卡中,就可以從SD卡中直接獲取圖片加載。并且SD卡所能存儲的圖片總數是一定的,會不斷的根據策略去舍去圖片的存留。

還有非常重要的一點:從圖片加載庫的使用者角度講,使用者無需關心內部到底是使用內存緩存,還是SD卡緩存,或是直接從網絡獲取的。這對于使用者來講,內部的一切用戶并不需要知道。使用者只需要知道加載圖片的接口。

對于圖片加載框架,內部實現是極其復雜的,目前我們并不需要了解其內部實現方式。

下面我們就使用最常用的圖片加載框架 Glide來完成我們圖片加載框架使用的演示。

怎樣使用第三方網絡加載庫加載圖片(Glide)

我們要知道,因為Android是開源的,所以會產生各種各樣的第三方框架,而我們不能盲目的去使用,要根據實際情況,從這之中挑選出最優的、最適合自己項目的框架,合理有效的去使用各種資源。而我們推薦的Glide是經過不斷的和其他框架對比所挑選出來性價比最高的!

目前國內主流的第三方網絡圖片加載庫有Glide(主推)、ImageLoader、Picasso、Volley、Fresco等,感興趣的小伙伴可以去搜索一下這些加載庫的全方面對比,百度一哈比比皆是,我們就不再這里將網上的一些大神所對比的實際內容再復述一遍啦。下面請跟我走4步,完成你人生中第一次加載網絡圖片吧!!!

首先我們要通過依賴 Glide 圖片加載庫。

在官方文檔中我們找到需要依賴的 Glide庫地址。

implementation 'com.github.bumptech.glide:glide:4.9.0'

將依賴地址放置到 app 模塊下的 build.gradle 中如圖:

添加完成后,我們點擊 右上角的 Sync Now ,從網絡下載依賴庫到本地,并依賴到 app 模塊。

我們在創建的空 Activity 當中,為 ImageView控件利用 Glide加載圖片。

okay,搞定!!使用第三圖片加載庫是不是很簡單。

其實里面的大致操作就是我們在第一個問題中書寫的代碼,里面多的就是各種緩存策略和邏輯處理。

結語

關于網絡圖片的加載我們今天就講到這里,請原諒小編沒有對Glide的源碼做詳解,因為內容過于復雜,涉及到很多初學者無法理解的知識,咱們目前只需要會使用,慢慢的跟著我們一起學習,后續這些都會融會貫通的~ 如果有小伙伴對Glide的源碼感興趣可以加入我們的微信群一起探討~ 在公眾號中回復微信群,就可以加入其中,也可以在公眾號中回復視頻,里面有一些初學者視頻哦~

PS:如果還有未看懂的小伙伴,歡迎加入我們的QQ技術交流群:892271582,里面有各種大神回答小伙伴們遇到的問題,我們的微信群馬上也將要和大家見面啦,屆時希望大家踴躍加入其中~~

總結

以上是生活随笔為你收集整理的android显示网络图片控件,Android控件之ImageView(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚州av影院| 91欧美在线视频 | 久久精品一二区 | 亚洲国产精选 | 欧美福利视频一区 | 色狠狠久久av大岛优香 | 先锋影音在线 | 黄色成年视频 | 牛牛免费视频 | 苍井空浴缸大战猛男120分钟 | 91国内揄拍国内精品对白 | 人人曰 | 日本性久久 | 免费激情小视频 | 久久色资源网 | 在线观看黄色小视频 | 亚洲视频一区 | 午夜色网站| 国产aⅴ激情无码久久久无码 | 日韩午夜在线 | 77久久| 成年人黄色大全 | 国产三级做爰高清在线 | 欧美xx孕妇 | 自拍偷拍中文字幕 | 狠狠干在线视频 | 日本另类视频 | 日韩久久高清 | 国产一区日韩 | 一级全黄毛片 | 草草影院一区二区三区 | 欧美有码视频 | 在线观看的黄网 | 精品久久久无码中文字幕 | 中文字幕在线一 | 国产av日韩一区二区三区精品 | 久操新在线 | 国产精品久久久久久久久久久久久久 | 国产成人精品123区免费视频 | av动漫免费看 | 亚洲国产成人精品女人久久 | 极品少妇视频 | 精品一区二区中文字幕 | 91国内产香蕉 | 日韩一级高清 | 91av影院| 依依成人在线视频 | 青青青在线视频免费观看 | 欧美黄大片 | 久久久午夜视频 | 久久精品视频免费播放 | 色狠狠干| 超碰自拍 | 天天操天天操天天操 | 伊人宗合 | 日韩欧美在线不卡 | 久草中文在线视频 | 撒尿free性hd | 伊人久久青青草 | 亚州久久久 | 国产一区免费视频 | 草民午夜理伦三级 | 黄视频免费看在线 | 久久久久久久久久99精品 | 四虎网址大全 | 亚洲黄色第一页 | 日日插夜夜爽 | 国产污在线观看 | 国产成人久久77777精品 | 欧美色图自拍 | 不卡在线 | 亚洲最新av | 久久黄色小说 | 欧美特级黄色 | 91调教视频 | 天天做天天爱天天做 | 日韩av不卡一区二区 | 毛片网站免费 | 欧美另类在线观看 | 精品久久久中文字幕 | 女女百合高h喷汁呻吟玩具 www.亚洲一区 | 中文字幕在线观看你懂的 | 日本成人在线播放 | 成人av无码一区二区三区 | 成人在线网址 | www裸玉足久久久 | 非洲黑寡妇性猛交视频 | 国产又黄又大又粗的视频 | 国产卡一卡二卡三 | 国产又猛又粗 | 久热精品在线观看 | 国产精品香蕉在线 | 热热色国产| av黄色一级片 | 青青草视频黄 | 青青青草视频在线 | 无码人妻精品一区二区蜜桃色欲 | 一本色道久久综合亚洲精品酒店 | 亚洲国产精品综合久久久 |