Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android網絡圖片查看器

Android網絡圖片查看器

編輯:Android開發教程

項目源碼下載

https://github.com/Wang-Jun-Chao/AndroidProjects

網絡圖片查看器

確定圖片的網址

發送http請求

        URL url =  URL(address);
        
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        
        conn.setConnectTimeout();
        conn.setReadTimeout();
        
        conn.setRequestMethod();
        
        
        
        conn.getResponseCode();

服務器的圖片是以流的形式返回給浏覽器的

        
        InputStream  = conn.getInputStream();
        
        Bitmap bm = BitmapFactory.decodeStream();

把圖片設置為ImageView的顯示內容

        ImageView iv = (ImageView) findViewById(R)
        iv(bm)

添加權限

主線程不能被阻塞

在Android中,主線程被阻塞會導致應用不能刷新ui界面,不能響應用戶操作,用戶體驗將非常差

主線程阻塞時間過長,系統會拋出ANR異常

ANR:Application Not Response;應用無響應

任何耗時操作都不可以寫在主線程

因為網絡交互屬於耗時操作,如果網速很慢,代碼會阻塞,所以網絡交互的代碼不能運行在主線程

只有主線程能刷新ui

刷新ui的代碼只能運行在主線程,運行在子線程是沒有任何效果的

如果需要在子線程中刷新ui,使用消息隊列機制

消息隊列

Looper一旦發現Message Queue中有消息,就會把消息取出,然後把消息扔給Handler對象,Handler會調用自己的handleMessage方法來處理這條消息

handleMessage方法運行在主線程

主線程創建時,消息隊列和輪詢器對象就會被創建,但是消息處理器對象,需要使用時,自行創建

        
        Handler handler =  Handler(){
            
            
              (android.os.Message msg) {

            }
        };

在子線程中往消息隊列裡發消息

        
         msg = new ();
        
        msg.obj = bm;
        
        msg.what = ;
        
        handler.sendMessage(msg);

通過switch語句區分不同的消息

        public void handleMessage(android msg) {
            switch (msg) {
            //如果是,說明屬於請求成功的消息
            case :
                ImageView iv = (ImageView) findViewById(R)
                Bitmap bm = (Bitmap) msg
                iv(bm)
                
            case :
                Toast(MainActivity, , )()
                
            }       
        }

更多精彩內容:http://www.bianceng.cn/OS/extra/

加入緩存圖片的功能

把服務器返回的流裡的數據讀取出來,然後通過文件輸入流寫至本地文件

        
        InputStream  = conn.getInputStream();
        

        FileOutputStream fos =  FileOutputStream(file);
        [] b =  [];
         len = ;
        ((len = .read(b)) != -){
            fos.write(b, , len);
        }

創建bitmap對象的代碼改成

        Bitmap bm = BitmapFactory(file())

每次發送請求前檢測一下在緩存中是否存在同名圖片,如果存在,則讀取緩存

獲取開源代碼的網站

code.google.com

github.com

在github搜索smart-image-view

下載開源項目smart-image-view

使用自定義組件時,標簽名字要寫包名

        </>

SmartImageView的使用

        SmartImageView siv = (SmartImageView) findViewById(R)
        siv()
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved