【Android基礎】AsyncTask樣本——載入網狀圖片

來源:互聯網
上載者:User

標籤:android   asynctask   下載   網路   

網路操作是一個嚴重的耗時操作,所以從Android 4.0版本開始,網路操作就被嚴禁放在主線程中,所以網路操作只能放在非同步任務中。

下面是一個從網路上下載圖片的樣本,樣本分為兩個部分:
- 非同步處理下載圖片
- UI線程中處理圖片

下載的圖片是在百度圖片裡面隨便找的:http://img1.ph.126.net/GPS04o8gJYuG4ZOwlx6UQA==/978125544087835399.jpg

首先是Layout布局,這個比較簡單,只需要一個ImageView顯示圖片和一個progressBar以查看是否下載完成,代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/RelativeLayout1"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="14dp"    tools:context="com.asynctasktest.MainActivity" >    <ImageView        android:id="@+id/imageView1"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        />    <ProgressBar        android:id="@+id/progressBar1"        android:visibility="gone"        style="?android:attr/progressBarStyleLarge"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true" /></RelativeLayout>

需注意把ProgressBar設定為隱藏:

下面是MainActivity裡的代碼:

package com.asynctasktest;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.Toast;public class MainActivity extends ActionBarActivity {private ImageView   mImageView = null;private ProgressBar mProgressBar = null;private String URL = "http://img1.ph.126.net/GPS04o8gJYuG4ZOwlx6UQA==/978125544087835399.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//執行個體化控制項this.mImageView = (ImageView) findViewById(R.id.imageView1);this.mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);//執行個體化非同步任務ImageDownloadTask task = new ImageDownloadTask();//執行非同步任務task.execute(URL);}class ImageDownloadTask extends AsyncTask<String,Void,Bitmap> {@Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap = null;    //待返回的結果String url = params[0];  //擷取URLURLConnection connection;   //網路連接對象InputStream   is;    //資料輸入流try {connection = new URL(url).openConnection();is = connection.getInputStream();   //擷取輸入資料流BufferedInputStream buf = new BufferedInputStream(is);//解析輸入資料流bitmap = BitmapFactory.decodeStream(buf);is.close();buf.close();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//返回給後面調用的方法return bitmap;}@Overrideprotected void onPreExecute() {//顯示等待圓環mProgressBar.setVisibility(View.VISIBLE);}@Overrideprotected void onPostExecute(Bitmap result) {//下載完畢,隱藏等待圓環mProgressBar.setVisibility(View.GONE);mImageView.setImageBitmap(result);}}}

最後是要在AndroidManifest裡加上網路存取權限:

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

MainActivity裡有一個內部類:ImageDownloadTask ,這個內部類用來下載指定URL的圖片,並把圖片在ImageView裡顯示出來。
將內部類非同步處理部分(即doInBackground方法)看做一個非同步圖片下載器,我們傳入這個下載器的是圖片的URL,下載器傳出的是圖片,同時我們不需要知道圖片載入進度,所以三個泛型參數的類型分別為String,Void和Bitmap。

當我們啟動非同步任務時,先執行onPreExecute方法,所以我們可以在這個方法裡顯示progressBar;然後就是啟動子線程執行doInBackground,並將參數傳給此方法,這個方法裡會進行網路操作,下載圖片並將其轉為為Bitmap返回,返回後子線程也結束了;最後執行的是onPostExecute方法,這個方法擷取的參數是非同步處理後的結果,即下載好的圖片,此方法給ImageView設定好下載好的圖片並隱藏progressBar。

下面是下載後的結果:

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

【Android基礎】AsyncTask樣本——載入網狀圖片

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.