綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[資料] 使用異步任務加載網絡上的圖片

[複製連結] 查看: 753|回覆: 0|好評: 0
跳轉到指定樓層
樓主
暗桌之光 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2011-8-2 13:18

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
  我們知道,如果要加載一個很耗時的操作,會阻塞主線程,這時我們可以想到開啟一個新的線程,避免阻塞,在android中也有這樣的問題,我們可以用異步任務來操作,異步任務也是開啟一個線程,線程裡面發一個訊息,然後通知去改變UI。

  廢話不多說,我們先看一個例子:我們可以開啟這個網址:http://img1.3lian.com/img2011/07/20/05.jpg可以看到一副很好看的圖片,我們就要把這個圖片顯示出來,首先,還是先要佈局,我們要顯示一幅圖片,所以我們的佈局中需要一個ImageView,佈局很簡單,一個ImageView就可以了:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.    xmlns:android="http://schemas.android.com/apk/res/android"
  4.    android:layout_width="match_parent"
  5.    android:layout_height="match_parent">
  6.      <ImageView
  7.        android:id="@+id/img"
  8.        android:scaleType="fitXY"
  9.        android:layout_width="match_parent"
  10.        android:layout_height="match_parent"/>
  11. </LinearLayout>
複製代碼
之後我們要寫一個Activity顯示這個圖片,不過要加載網絡上的圖片,我們需要從一個URL的流中獲取這個圖片,所以我們要寫一個方法來獲取這張圖片:
  1. public Drawable loadImages(String url) {
  2.          try {
  3.              return Drawable.createFromStream((InputStream)(new URL(url)).openStream(), "test");
  4.          }
  5.          catch (IOException e) {
  6.              e.printStackTrace();
  7.          }
  8.          return null;
  9.      }
複製代碼
從URL中開啟流,強制轉換成InputStream,然後從流中拿到Drawable。

  既然可以獲取圖片了,我們要考慮一個問題,如果圖片很大,加載的很慢怎麼辦,我們豈不是要等很久?不要緊,這時候我們就可以用異步任務了。

  首先我們要寫一個內部類,這個類部類是繼承自異步任務的,需要重載裡面的doBackGround方法:
  1.   private class ImageAsynTask extends AsyncTask<Void, Void, Drawable> {

  2.          @Override
  3.          protected Drawable doInBackground (Void... params) {
  4.              String url = "http://img1.3lian.com/img2011/07/20/05.jpg";
  5.              return loadImages(url);
  6.          }
  7.          
  8.          @Override
  9.          protected void onPostExecute (Drawable result) {
  10.              super.onPostExecute(result);
  11.              mDialog.dismiss();
  12.              mImage.setImageDrawable(result);
  13.          }
  14.          
  15.          @Override
  16.          protected void onPreExecute () {
  17.              super.onPreExecute();
  18.              mDialog.show();
  19.          }
  20.      }
複製代碼
首先看這個方法:onPreExecute()這個方法是在doInBackGround前面執行。我們把這個方法寫出來,我們需要在獲取圖片之前等待的時間裡,寫一個progressDialog,顯示出來,提示用戶,目前正在加載圖片,需要等待一段時間。同時在後台操作doBackGround執行。

  在doBackGround完成之後就會執行onPostExecute(Drawable result)方法,看這個方法就知道,必須在doBackGround完成之後,把得到的結果Drawable作為參數傳到onPostExecute方法裡面去,執行這個方法就表示已經加載完了,我們需要將progressDialog消失掉,然後把圖片顯示出來就可以了,整個過程很簡單。

  看下整個Activity的代碼:
  1. package com.test.asyntask;

  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.URL;

  5. import android.app.Activity;
  6. import android.app.ProgressDialog;
  7. import android.graphics.drawable.Drawable;
  8. import android.os.AsyncTask;
  9. import android.os.Bundle;
  10. import android.widget.ImageView;

  11. import com.test.R;

  12. public class AsynTask extends Activity {
  13.      
  14.      private ImageView mImage;
  15.      private ProgressDialog mDialog;
  16.      
  17.      @Override
  18.      protected void onCreate (Bundle savedInstanceState) {
  19.          super.onCreate(savedInstanceState);
  20.          setContentView(R.layout.asyn_task);
  21.          
  22.          mDialog = new ProgressDialog(this);
  23.          mDialog.setTitle("請稍等");
  24.          mDialog.setMessage("正在加載...");
  25.          
  26.          mImage = (ImageView) findViewById(R.id.img);
  27.          new ImageAsynTask().execute();
  28.      }
  29.      
  30.      private class ImageAsynTask extends AsyncTask<Void, Void, Drawable> {

  31.          @Override
  32.          protected Drawable doInBackground (Void... params) {
  33.              String url = "http://img1.3lian.com/img2011/07/20/05.jpg";
  34.              return loadImages(url);
  35.          }
  36.          
  37.          @Override
  38.          protected void onPostExecute (Drawable result) {
  39.              super.onPostExecute(result);
  40.              mDialog.dismiss();
  41.              mImage.setImageDrawable(result);
  42.          }
  43.          
  44.          @Override
  45.          protected void onPreExecute () {
  46.              super.onPreExecute();
  47.              mDialog.show();
  48.          }
  49.      }
  50.      
  51.      @Override
  52.      protected void onDestroy () {
  53.          super.onDestroy();
  54.          mDialog.dismiss();
  55.      }
  56.    
  57.      public Drawable loadImages(String url) {
  58.          try {
  59.              return Drawable.createFromStream((InputStream)(new URL(url)).openStream(), "test");
  60.          }
  61.          catch (IOException e) {
  62.              e.printStackTrace();
  63.          }
  64.          return null;
  65.      }
  66. }
複製代碼
執行一下,看下效果:
  1.顯示progressDialog的時候,在加載圖片但是圖片還沒有加載出來的時候:
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

Test2.2.rar

602.32 KB, 下載次數: 5, 下載積分: 碎鑽 -1 個

收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則