編輯:Android開發實例
本章寫一個程序用來讀取網絡圖片的功能,實現一個功能讀取到服務器上的一張圖片,然後下載到本地的程序本程序使用多線程來讀取網絡圖片,包括自動判斷緩存文件,還有進度條。別的不多說,上內容,我把實現過程都當做注釋寫到程序裡了,很完全。希望對初學的朋友有幫助!
1、讀取進度條的效果
2、成功讀取到圖片的效果
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>
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放