android開發--獲取網絡圖片,讀取進度條


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

 

1、讀取進度條的效果

image

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

image

 

1.首先是Activity 

package cn.itcast.pic;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class mainActivity extends Activity {
    private TextView addressET;
    private ImageView imageIV;
    private Handler handler=new Handler(); //在主線程中創建handler
    private ProgressDialog dialog;
    private ImageService service;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //1、獲取對話框的id
        addressET = (TextView) this.findViewById(R.id.addressET);
        imageIV = (ImageView) this.findViewById(R.id.imageIV);
        
        service = new ImageService(this);
        
    }
    
    public void onClick(View v){
        //把圖片放在一個新的線程里面來讀取.
        new Thread(){//創建一個新的線程
            public void run(){
                try {
                String address = addressET.getText().toString();
                
                handler.post(new Runnable() {//此處用一個匿名內部類,runnable自動把消息發送給主線程創建處理的handler,主線程會自動更新。
                    public void run() {

                        dialog=new ProgressDialog(mainActivity.this);
                        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//設置進度條樣式
                        dialog.setMessage("請稍候...");
                        dialog.setCancelable(false);//判斷是否取消進度條
                        dialog.show();
                    }
                });
                    
                
                    //由於網絡操作比較耗時,所以在新線程中操作
                    final Bitmap image = service.getImage(address);
                    handler.post(new Runnable() {
                        public void run() {
                            dialog.dismiss();
                            imageIV.setImageBitmap(image);//新線程更新界面,需要使用handler
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "服務器忙,請稍后再試!", 0).show();
                }
            }
        }.start();
    }
}

            

2.然后是讀取圖片的service

package cn.itcast.pic;

import java.io.File;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import android.accounts.NetworkErrorException;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;

public class ImageService {

    private Context context;

    public ImageService(Context context) {
        super();
        this.context = context;
    }

    public Bitmap getImage(String address) throws Exception {
        // 1.通過Url對象封裝url對象
        URL url = new URL(address);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(3000);

        // 2.判斷是否有緩存文件
        File cacheFile = new File(context.getCacheDir(),
                URLEncoder.encode(address));// 緩存文件
        if (cacheFile.exists())// 判斷是否有緩存
            conn.setIfModifiedSince(cacheFile.lastModified());// 發送緩存文件的最后修改時間

        // 3.獲取狀態碼,根據狀態嗎來判斷接下來的操作。讀取文件?還是寫緩存,寫緩存的時候記着用多個線程
        int code = conn.getResponseCode();
        if (code == 200) {
            byte[] data = Util.read(conn.getInputStream());
            Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);// 轉化為圖片
            weiteCache(cacheFile, bm);
            return bm;
        } else if(code==304){
            return BitmapFactory.decodeFile(cacheFile.getAbsolutePath());//讀取本地數據,並轉為圖片來顯示
        }
        
//        如果不成功,拋異常,給我們自己看的
        throw new NetworkErrorException("訪問服務器出錯:"+code);
        

    }

    // 4. 寫緩存文件
    private void weiteCache(final File cacheFile, final Bitmap bm) {
        // 使用一個新的線程來寫,這樣的好處就是在頁面打開的時候不會因為寫緩存而等待時間
        new Thread() {
            public void run() {
                try {
                    FileOutputStream fos = new FileOutputStream(cacheFile);
                    bm.compress(CompressFormat.JPEG, 100, fos);//指定格式 存儲到本地
                    fos.close();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }

            }
        }.start();

    }

}

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

package cn.itcast.pic;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class Util {

    public static byte[] read(InputStream in) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1)
            baos.write(buffer, 0, len);
        baos.close();
        byte[] data = baos.toByteArray();
        return data;
    }
    
}

4.主界面XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <EditText
            android:id="@+id/addressET"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:inputType="textEmailAddress" >

            <requestFocus />
        </EditText>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text=" GO " />
    </LinearLayout>

    <ImageView
        android:id="@+id/imageIV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM