我们平时在开发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"/>