天天看點

Volley加載網絡圖檔

我們平時在開發Android應用的時候不可避免地都需要用到網絡技術,而多數情況下應用程式都會使用HTTP協定來發送和接收網絡資料。Android系統中主要提供了兩種方式來進行HTTP通信,HttpURLConnection和HttpClient,幾乎在任何項目的代碼中我們都能看到這兩個類的身影,使用率非常高。

不過HttpURLConnection和HttpClient的用法還是稍微有些複雜的,如果不進行适當封裝的話,很容易就會寫出不少重複代碼。于是乎,一些Android網絡通信架構也就應運而生,比如說AsyncHttpClient,它把HTTP所有的通信細節全部封裝在了内部,我們隻需要簡單調用幾行代碼就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上顯示網絡圖檔的操作變得極度簡單,開發者不用關心如何從網絡上擷取圖檔,也不用關心開啟線程、回收圖檔資源等細節,Universal-Image-Loader已經把一切都做好了。

Android開發團隊也是意識到了有必要将HTTP的通信操作再進行簡單化,于是在2013年Google I/O大會上推出了一個新的網絡通信架構——Volley。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖檔。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目标就是非常适合去進行資料量不大,但通信頻繁的網絡操作,而對于大資料量的網絡操作,比如說下載下傳檔案等,Volley的表現就會非常糟糕。

介紹了這麼多理論的東西,下面我們就準備開始進行實戰了,首先需要将Volley的jar包準備好

Volley加載網絡圖檔

ImageRequest的用法

1. 建立一個RequestQueue對象。

2. 建立一個Request對象。

3. 将Request對象添加到RequestQueue裡面。

Volley加載網絡圖檔
MainActivity      
package com.example.administrator.volleyimageview;

import android.content.Context;
import android.graphics.Bitmap;
import android.media.Image;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends AppCompatActivity {
        private ImageView iv_img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //尋找ID
        iv_img = (ImageView) findViewById(R.id.iv_img);
        //定義一個方法
        loadImageByVolley();
    }
    /**
     *  通過Volley加載網絡圖檔
     *  new ImageRequest(String url,Listener listener,int maxWidth,int maxHeight,Config decodeConfig,ErrorListener errorListener)
     *  url:請求位址
     *  listener:請求成功後的回調
     *  maxWidth、maxHeight:設定圖檔的最大寬高,如果均設為0則表示按原尺寸顯示
     *  decodeConfig:圖檔像素的儲存方式。Config.RGB_565表示每個像素占2個位元組,Config.ARGB_8888表示每個像素占4個位元組等。
     *  errorListener:請求失敗的回調
     */
    private void loadImageByVolley() {
        String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
        // 建立一個Request對象。
        ImageRequest request = new ImageRequest(
                url,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        iv_img.setImageBitmap(bitmap);
                    }
                },0, 0,
                Bitmap.Config.RGB_565,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        iv_img.setImageResource(R.mipmap.ic_launcher);
                    }
                });
        //将Request對象添加到RequestQueue裡面。
        MyApplication.getHttpQueues().add(request);
    }
    }


      
MyApplication      
package com.example.administrator.volleyimageview;

import android.app.Application;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * Created by Administrator on 2016/3/21.
 */
public class MyApplication extends Application {
    private static RequestQueue queues ;
    @Override
    public void onCreate() {
        super.onCreate();
        queues = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueues() {
        return queues;
    }

Activity_main.xml      
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:fitsSystemWindows="true"
    tools:context="com.example.administrator.volleyimageview.MainActivity">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:gravity="center">
        <ImageView
            android:id="@+id/iv_img"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
</LinearLayout>      
*注意最後       
在清單配置檔案裡需要添加網絡權限!      
<!-- 添加網絡操作權限 -->
<uses-permission android:name="android.permission.INTERNET"/>      

繼續閱讀