android非同步回調載入網狀圖片

來源:互聯網
上載者:User

 

在做應用的時候很多時候都會去從網路載入圖片,而且還要做各種各樣的載入效果。比如,載入圖片的時候在圖片上顯示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的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.