Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android實現獲取網絡圖片時顯示讀取進度條

android實現獲取網絡圖片時顯示讀取進度條

編輯:Android開發實例

 本章寫一個程序用來讀取網絡圖片的功能,實現一個功能讀取到服務器上的一張圖片,然後下載到本地的程序本程序使用多線程來讀取網絡圖片,包括自動判斷緩存文件,還有進度條。別的不多說,上內容,我把實現過程都當做注釋寫到程序裡了,很完全。希望對初學的朋友有幫助!

 

1、讀取進度條的效果

2、成功讀取到圖片的效果

 

1.首先是Activity 

 

  1. package cn.itcast.pic; 
  2.  
  3. import android.app.Activity; 
  4. import android.app.ProgressDialog; 
  5. import android.graphics.Bitmap; 
  6. import android.os.Bundle; 
  7. import android.os.Handler; 
  8. import android.view.View; 
  9. import android.widget.ImageView; 
  10. import android.widget.TextView; 
  11. import android.widget.Toast; 
  12.  
  13. public class mainActivity extends Activity { 
  14.     private TextView addressET; 
  15.     private ImageView imageIV; 
  16.     private Handler handler=new Handler(); //在主線程中創建handler 
  17.     private ProgressDialog dialog; 
  18.     private ImageService service; 
  19.  
  20.     public void onCreate(Bundle savedInstanceState) { 
  21.         super.onCreate(savedInstanceState); 
  22.         setContentView(R.layout.main); 
  23.         //1、獲取對話框的id 
  24.         addressET = (TextView) this.findViewById(R.id.addressET); 
  25.         imageIV = (ImageView) this.findViewById(R.id.imageIV); 
  26.          
  27.         service = new ImageService(this); 
  28.          
  29.     } 
  30.      
  31.     public void onClick(View v){ 
  32.         //把圖片放在一個新的線程裡面來讀取. 
  33.         new Thread(){//創建一個新的線程 
  34.             public void run(){ 
  35.                 try { 
  36.                 String address = addressET.getText().toString(); 
  37.                  
  38.                 handler.post(new Runnable() {//此處用一個匿名內部類,runnable自動把消息發送給主線程創建處理的handler,主線程會自動更新。 
  39.                     public void run() { 
  40.  
  41.                         dialog=new ProgressDialog(mainActivity.this); 
  42.                         dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//設置進度條樣式 
  43.                         dialog.setMessage("請稍候..."); 
  44.                         dialog.setCancelable(false);//判斷是否取消進度條 
  45.                         dialog.show(); 
  46.                     } 
  47.                 }); 
  48.                      
  49.                  
  50.                     //由於網絡操作比較耗時,所以在新線程中操作 
  51.                     final Bitmap image = service.getImage(address); 
  52.                     handler.post(new Runnable() { 
  53.                         public void run() { 
  54.                             dialog.dismiss(); 
  55.                             imageIV.setImageBitmap(image);//新線程更新界面,需要使用handler 
  56.                         } 
  57.                     }); 
  58.                 } catch (Exception e) { 
  59.                     e.printStackTrace(); 
  60.                     Toast.makeText(getApplicationContext(), "服務器忙,請稍後再試!", 0).show(); 
  61.                 } 
  62.             } 
  63.         }.start(); 
  64.     } 

2.然後是讀取圖片的service

 

  1. package cn.itcast.pic; 
  2.  
  3. import java.io.File; 
  4. import java.io.FileOutputStream; 
  5. import java.net.HttpURLConnection; 
  6. import java.net.URL; 
  7. import java.net.URLEncoder; 
  8.  
  9. import android.accounts.NetworkErrorException; 
  10. import android.content.Context; 
  11. import android.graphics.Bitmap; 
  12. import android.graphics.Bitmap.CompressFormat; 
  13. import android.graphics.BitmapFactory; 
  14.  
  15. public class ImageService { 
  16.  
  17.     private Context context; 
  18.  
  19.     public ImageService(Context context) { 
  20.         super(); 
  21.         this.context = context; 
  22.     } 
  23.  
  24.     public Bitmap getImage(String address) throws Exception { 
  25.         // 1.通過Url對象封裝url對象 
  26.         URL url = new URL(address); 
  27.         HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
  28.         conn.setReadTimeout(3000); 
  29.  
  30.         // 2.判斷是否有緩存文件 
  31.         File cacheFile = new File(context.getCacheDir(), 
  32.                 URLEncoder.encode(address));// 緩存文件 
  33.         if (cacheFile.exists())// 判斷是否有緩存 
  34.             conn.setIfModifiedSince(cacheFile.lastModified());// 發送緩存文件的最後修改時間 
  35.  
  36.         // 3.獲取狀態碼,根據狀態嗎來判斷接下來的操作。讀取文件?還是寫緩存,寫緩存的時候記著用多個線程 
  37.         int code = conn.getResponseCode(); 
  38.         if (code == 200) { 
  39.             byte[] data = Util.read(conn.getInputStream()); 
  40.             Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);// 轉化為圖片 
  41.             weiteCache(cacheFile, bm); 
  42.             return bm; 
  43.         } else if(code==304){ 
  44.             return BitmapFactory.decodeFile(cacheFile.getAbsolutePath());//讀取本地數據,並轉為圖片來顯示 
  45.         } 
  46.          
  47. //        如果不成功,拋異常,給我們自己看的 
  48.         throw new NetworkErrorException("訪問服務器出錯:"+code); 
  49.          
  50.  
  51.     } 
  52.  
  53.     // 4. 寫緩存文件 
  54.     private void weiteCache(final File cacheFile, final Bitmap bm) { 
  55.         // 使用一個新的線程來寫,這樣的好處就是在頁面打開的時候不會因為寫緩存而等待時間 
  56.         new Thread() { 
  57.             public void run() { 
  58.                 try { 
  59.                     FileOutputStream fos = new FileOutputStream(cacheFile); 
  60.                     bm.compress(CompressFormat.JPEG, 100, fos);//指定格式 存儲到本地 
  61.                     fos.close(); 
  62.                 } catch (Exception e) { 
  63.                     throw new RuntimeException(e); 
  64.                 } 
  65.  
  66.             } 
  67.         }.start(); 
  68.  
  69.     } 
  70.  

3.讀取網絡文件的一個工具類

 

  1. package cn.itcast.pic; 
  2.  
  3. import java.io.ByteArrayOutputStream; 
  4. import java.io.IOException; 
  5. import java.io.InputStream; 
  6.  
  7. public class Util { 
  8.  
  9.     public static byte[] read(InputStream in) throws IOException { 
  10.         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  11.         byte[] buffer = new byte[1024]; 
  12.         int len; 
  13.         while ((len = in.read(buffer)) != -1) 
  14.             baos.write(buffer, 0, len); 
  15.         baos.close(); 
  16.         byte[] data = baos.toByteArray(); 
  17.         return data; 
  18.     } 
  19.      

4.主界面XML

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.     <LinearLayout 
  8.         android:layout_width="fill_parent" 
  9.         android:layout_height="wrap_content" > 
  10.  
  11.         <EditText 
  12.             android:id="@+id/addressET" 
  13.             android:layout_width="0dp" 
  14.             android:layout_height="wrap_content" 
  15.             android:layout_weight="1" 
  16.             android:inputType="textEmailAddress" > 
  17.  
  18.             <requestFocus /> 
  19.         </EditText> 
  20.  
  21.         <Button 
  22.             android:layout_width="wrap_content" 
  23.             android:layout_height="wrap_content" 
  24.             android:onClick="onClick" 
  25.             android:text=" GO " /> 
  26.     </LinearLayout> 
  27.  
  28.     <ImageView 
  29.         android:id="@+id/imageIV" 
  30.         android:layout_width="wrap_content" 
  31.         android:layout_height="wrap_content" /> 
  32.  
  33. </LinearLayout> 

 

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