標籤: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樣本——載入網狀圖片