2025-02-17

 

在做應用的時候很多時候都會去從網絡加載圖片,而且還要做各種各樣的加載效果。比如,加載圖片的時候在圖片上顯示loading的圖片,圖片加載完成時loading消失,加載失敗又有相應的處理。如果處理不好就會很麻煩,下面總結瞭一個輕量級的從網絡加載圖片方法。

 

 

package com.jacp.util; 

 

import java.io.File; 

import java.io.IOException; 

import java.net.HttpURLConnection; 

import java.net.MalformedURLException; 

import java.net.URL; 

 

import android.graphics.Bitmap; 

import android.graphics.BitmapFactory; 

import android.os.Handler; 

import android.os.Message; 

 

public class Utils 

 

    /**

     * 加載圖片

     * @param url 圖片的url

     * @param listener 回調監聽器

     */ 

    public void loadImage(final String url, final OnLoadImageListener listener) 

    { 

        if (null == url || null == listener) 

        { 

            return; 

        } 

         

        final Handler handler = new Handler() 

        { 

            public void handleMessage(Message msg) 

            { 

                listener.onLoadImage((Bitmap) msg.obj, url); 

            } 

        }; 

         

        // 之前根據url寫入本地緩存的路徑 

        String path = ""; 

        File file = new File(path); 

        if (file.exists()) 

        { 

            Bitmap bm = BitmapFactory.decodeFile(path); 

            sendMessage(handler, bm); 

            return; 

        } 

 

        new Thread(new Runnable() 

        { 

            public void run() 

            { 

                try 

                { 

                    // 網絡加載圖片,還可以加入延遲(time out)條件 

                    URL u = new URL(url); 

                    HttpURLConnection httpConnection = (HttpURLConnection) u.openConnection(); 

                    if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) 

                    { 

                        Bitmap bm = BitmapFactory.decodeStream(httpConnection.getInputStream()); 

                        sendMessage(handler, bm); 

                        // 同時對圖片進行緩存… 

                        return; 

                    } 

                     

                    // 沒有請求到圖片 

                    sendMessage(handler, null); 

                } catch (MalformedURLException e) 

                { 

                    sendMessage(handler, null); 

                } catch (IOException e) 

                { 

                    sendMessage(handler, null); 

                } 

            } 

        }).start(); 

             

    } 

     

    /**

     * 向handler發送處理的消息

     * @param handler

     * @param bm

     */ 

    private void sendMessage(Handler handler, Bitmap bm) 

    { 

        Message msg = handler.obtainMessage(); 

        msg.obj = bm; 

        handler.sendMessage(msg); 

    } 

     

    /**

     * 加載圖片時的回調

     *

     */ 

    public interface OnLoadImageListener 

    { 

        public void onLoadImage(Bitmap bm, String imageUrl); 

    } 

 

此例中用到瞭Handler,從而不需要用到AsyncTask,AsyncTask感覺使用起來很麻煩,而且貌似還有延遲。這樣做的話可以直接在回調裡面做設置圖片處理,而不必要擔心是不是UI線程。如下:

 

new Utils().loadImage("圖片鏈接", new OnLoadImageListener() 

        { 

            @Override 

            public void onLoadImage(Bitmap bm, String imageUrl) 

            { 

                if (null == bm) 

                { 

                    imageView.setImageResource(R.drawable.default_img); 

                } 

                else 

                { 

                    imageView.setBitmapImage(bm); 

                } 

            } 

             

        }); 

 

如有遺漏之處,歡迎批評!

摘自:jacp的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *