Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android-007][網絡圖片查看器]

[Android-007][網絡圖片查看器]

編輯:關於Android編程

 


網絡圖片查看器


確定圖片的網址 發送http請求
        URL url = new URL(address);
        //獲取連接對象,並沒有建立連接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //設置連接和讀取超時
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(5000);
        //設置請求方法,注意必須大寫
        conn.setRequestMethod(GET);
        //建立連接,發送get請求
        //conn.connect();
        //建立連接,然後獲取響應嗎,200說明請求成功
        conn.getResponseCode();
服務器的圖片是以流的形式返回給浏覽器的
        //拿到服務器返回的輸入流
        InputStream is = conn.getInputStream();
        //把流裡的數據讀取出來,並構造成圖片
        Bitmap bm = BitmapFactory.decodeStream(is);
把圖片設置為ImageView的顯示內容
        ImageView iv = (ImageView) findViewById(R.id.iv);
        iv.setImageBitmap(bm);
添加權限

主線程不能被阻塞

在Android中,主線程被阻塞會導致應用不能刷新ui界面,不能響應用戶操作,用戶體驗將非常差 主線程阻塞時間過長,系統會拋出ANR異常 ANR:Application Not Response;應用無響應 任何耗時操作都不可以寫在主線程 因為網絡交互屬於耗時操作,如果網速很慢,代碼會阻塞,所以網絡交互的代碼不能運行在主線程

只有主線程能刷新ui

刷新ui的代碼只能運行在主線程,運行在子線程是沒有任何效果的 如果需要在子線程中刷新ui,使用消息隊列機制

消息隊列

Looper一旦發現Message Queue中有消息,就會把消息取出,然後把消息扔給Handler對象,Handler會調用自己的handleMessage方法來處理這條消息 handleMessage方法運行在主線程 主線程創建時,消息隊列和輪詢器對象就會被創建,但是消息處理器對象,需要使用時,自行創建
        //消息隊列
        Handler handler = new Handler(){
            //主線程中有一個消息輪詢器looper,不斷檢測消息隊列中是否有新消息,如果發現有新消息,
            //自動調用此方法,注意此方法是在主線程中運行的
            public void handleMessage(android.os.Message msg) {

            }
        };
在子線程中往消息隊列裡發消息
        //創建消息對象
        Message msg = new Message();
        //消息的obj屬性可以賦值任何對象,通過這個屬性可以攜帶數據
        msg.obj = bm;
        //what屬性相當於一個標簽,用於區分出不同的消息,從而運行不能的代碼
        msg.what = 1;
        //發送消息
        handler.sendMessage(msg);
通過switch語句區分不同的消息
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            //如果是1,說明屬於請求成功的消息
            case 1:
                ImageView iv = (ImageView) findViewById(R.id.iv);
                Bitmap bm = (Bitmap) msg.obj;
                iv.setImageBitmap(bm);
                break;
            case 2:
                Toast.makeText(MainActivity.this, 請求失敗, 0).show();
                break;
            }       
        }

加入緩存圖片的功能

把服務器返回的流裡的數據讀取出來,然後通過文件輸入流寫至本地文件
        //1.拿到服務器返回的輸入流
        InputStream is = conn.getInputStream();
        //2.把流裡的數據讀取出來,並構造成圖片

        FileOutputStream fos = new FileOutputStream(file);
        byte[] b = new byte[1024];
        int len = 0;
        while((len = is.read(b)) != -1){
            fos.write(b, 0, len);
        }
創建bitmap對象的代碼改成
        Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
每次發送請求前檢測一下在緩存中是否存在同名圖片,如果存在,則讀取緩存

獲取開源代碼的網站

code.google.com github.com 在github搜索smart-image-view 下載開源項目smart-image-view 使用自定義組件時,標簽名字要寫包名
        
SmartImageView的使用
        SmartImageView siv = (SmartImageView) findViewById(R.id.siv);
        siv.setImageUrl(http://192.168.1.102:8080/dd.jpg);

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved