我們平時在開發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包準備好
ImageRequest的用法
1. 建立一個RequestQueue對象。
2. 建立一個Request對象。
3. 将Request對象添加到RequestQueue裡面。
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"/>