Android 下載網(wǎng)絡(luò)圖片并顯示到本地
Android下載網(wǎng)絡(luò)圖片的流程是:
發(fā)送網(wǎng)絡(luò)請(qǐng)求->將圖片以流的形式下載下來(lái)->將流轉(zhuǎn)換為Bitmap并賦給ImageView控件。
注意點(diǎn)
- 最新的Android系統(tǒng)不可以在主線程上請(qǐng)求網(wǎng)絡(luò),需要使用線程來(lái)請(qǐng)求
- 下載圖片屬于耗時(shí)任務(wù),最優(yōu)做法是放在一個(gè)AsyncTask中操作
設(shè)計(jì)思路
1.網(wǎng)絡(luò)請(qǐng)求:該例中需要下載的文件類型是圖片類型,可以將網(wǎng)絡(luò)請(qǐng)求獲取的數(shù)據(jù)類型轉(zhuǎn)換為Bitmap已供ImageView直接使用,但是一個(gè)合理的網(wǎng)絡(luò)請(qǐng)求類的設(shè)計(jì)是將下載的數(shù)據(jù)類型轉(zhuǎn)換為最基本的InputStream,這樣不管是下載圖片,音頻,文本還是視頻,都可以將結(jié)果拋出去讓上層的邏輯來(lái)處理。
2.異步請(qǐng)求:下載圖片,網(wǎng)絡(luò)下載屬于耗時(shí)操作,所以需要封裝一個(gè)AsyncTask來(lái)處理網(wǎng)絡(luò)請(qǐng)求,該請(qǐng)求繼承自Runnable接口。
3.異步回調(diào):前臺(tái)需要通過(guò)回調(diào)的方式來(lái)得到圖片源,并將該圖片源賦值給ImageView.
相關(guān)代碼
NetService:網(wǎng)絡(luò)請(qǐng)求服務(wù)類
public class NetService {
public static InputStream getInputStreamByUrl(String address){
URL url = null;
HttpURLConnection urlConnection = null;
try {
url = new URL(address);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setConnectTimeout(2 * 1000);
urlConnection.setRequestMethod("GET");
return urlConnection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
NetServiceTask:AsyncTask類
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import java.io.BufferedInputStream;
import java.io.InputStream;
public class NetServiceTask extends AsyncTask
public NetServiceTask(String address, URLPostHandler urlPostHandler) {
this.address=address;
this.urlPostHandler=urlPostHandler;
}
/**
* 表示任務(wù)執(zhí)行之前的操作
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
/**
* 主要是完成耗時(shí)的操作
*/
@Override
protected Bitmap doInBackground(String... arg0) {
InputStream inputStream=NetService.getInputStreamByUrl(arg0[0]);
if(inputStream!=null){
return BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
}
return null;
}
/**
* 主要是更新UI的操作
*/
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(this.urlPostHandler!=null&&result!=null){
this.urlPostHandler.PostHandler(result);
}
}
@Override
public void run() {
execute(this.address);
}
}
URLPostHandler:回調(diào)接口
public interface URLPostHandler {
void PostHandler(Bitmap bitmap);
}
前臺(tái)請(qǐng)求圖片并顯示到ImageView
public class MainActivity extends AppCompatActivity {
Button buttonDownload;
ImageView imageViewImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonDownload = (Button) findViewById(R.id.buttonDownload);
imageViewImg = (ImageView) findViewById(R.id.imageViewImg);
buttonDownload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String address = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490783056273&di=6160d101d31dcf5f44b443ad9c5b2648&imgtype=0&src=http%3A%2F%2Fimg.sc115.com%2Fuploads%2Fallimg%2F110626%2F2011062622383898.jpg";
NetServiceTask netServerTask= new NetServiceTask(address,new URLPostHandler() {
@Override
public void PostHandler(Bitmap bitmap) {
imageViewImg.setImageBitmap(bitmap);
}
});
Thread thread=new Thread(netServerTask);
thread.start();
}
});
}
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- Android 網(wǎng)絡(luò)圖片查看顯示的實(shí)現(xiàn)方法
- Android讀取本地或網(wǎng)絡(luò)圖片并轉(zhuǎn)換為Bitmap
- Android 異步獲取網(wǎng)絡(luò)圖片并處理導(dǎo)致內(nèi)存溢出問(wèn)題解決方法
- Android顯示網(wǎng)絡(luò)圖片實(shí)例
- 簡(jiǎn)單實(shí)現(xiàn)Android讀取網(wǎng)絡(luò)圖片到本地
- Android使用線程獲取網(wǎng)絡(luò)圖片的方法
- 在Android的應(yīng)用中實(shí)現(xiàn)網(wǎng)絡(luò)圖片異步加載的方法
- Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能
- Android 讀取sdcard上的圖片實(shí)例(必看)
- Android sdcard實(shí)現(xiàn)圖片存儲(chǔ) 、聯(lián)網(wǎng)下載
- Android開發(fā)實(shí)現(xiàn)加載網(wǎng)絡(luò)圖片并下載至本地SdCard的方法
相關(guān)文章
Android幀率監(jiān)測(cè)與優(yōu)化技巧
Android 應(yīng)用的性能優(yōu)化是開發(fā)過(guò)程中至關(guān)重要的一環(huán),而幀率(Frame Rate)是評(píng)估應(yīng)用性能的一個(gè)關(guān)鍵指標(biāo),在本文中,我們將深入探討如何監(jiān)測(cè) Android 應(yīng)用的幀率,以及如何通過(guò)代碼示例來(lái)優(yōu)化應(yīng)用的性能,需要的朋友可以參考下2023-10-10
Android開發(fā)教程之shape和selector的結(jié)合使用
shape和selector是Android UI設(shè)計(jì)中經(jīng)常用到的,比如我們要自定義一個(gè)圓角Button,點(diǎn)擊Button有些效果的變化,就要用到shape和selector,接下來(lái)通過(guò)本文給大家介紹Android開發(fā)教程之shape和selector的結(jié)合使用,感興趣的朋友一起學(xué)習(xí)吧2016-01-01
android用java和c實(shí)現(xiàn)查找sd卡掛載路徑(sd卡路徑)的方法
這篇文章主要介紹了android用java和c實(shí)現(xiàn)查找sd卡掛載路徑(sd卡路徑)的方法,需要的朋友可以參考下2014-02-02
Android系統(tǒng)狀態(tài)欄定制圖標(biāo)顯示邏輯控制
這篇文章主要為大家介紹了Android系統(tǒng)狀態(tài)欄定制圖標(biāo)顯示邏輯控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android ActionBarActivity設(shè)置全屏無(wú)標(biāo)題的方法總結(jié)
這篇文章主要介紹了Android ActionBarActivity設(shè)置全屏無(wú)標(biāo)題的相關(guān)資料,需要的朋友可以參考下2017-07-07
Android scrollTo和scrollBy方法使用解析
在一個(gè)View中,系統(tǒng)提供了scrollTo、scrollBy兩種方式來(lái)改變一個(gè)View的位置,下面通過(guò)本文給大家介紹Android scrollTo和scrollBy方法使用解析,需要的朋友參考下吧2018-01-01

