您的位置:首页 > 理论基础 > 计算机网络

Android-Volley网络通信框架

2016-01-06 17:28 441 查看


1.回顾

上篇对 Volley进行了简单介绍和对它的学习目的与目标,最后,为学习Volley做了一些准备


2.重点

2.1 RequestQueue 请求队列的建立

2.2 学习 StringRequest和JsonObjectRequest ;


3.RequestQueue 请求队列的建立

新建类 volleyApplication 继承自Application , 使用单例模式创建 请求处理队列, 实现如下:

[java] view
plaincopy

package com.example.volleyHttp;

import com.android.volley.RequestQueue;

import com.android.volley.toolbox.Volley;

import android.app.Application;

public class volleyApplication extends Application {

/**

* 01. 建立 请求队列

* 02. 将 请求队列 加入到 AndroidMain.xml中

* 03.

*/

private static RequestQueue queue;

@Override

public void onCreate() {

// TODO Auto-generated method stub

super.onCreate();

queue=Volley.newRequestQueue(getApplicationContext());

}

//入口

public static RequestQueue getQueue(){

return queue;

}

}

这个可以与Activity 发生联动作用,在Activity 退出的时候,可以取消的 网络请求操作(通过
tag实现);下面可以实现:

[java] view
plaincopy

@Override

protected void onStop() {

// TODO Auto-generated method stub

volleyApplication.getQueue().cancelAll("strReqGet");

super.onStop();

}

使用的时候需要在 AndroidMainfist.xml 文件里 的 Application 标签下 注册 刚才的 volleylication:

[html] view
plaincopy

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

<span style="color:#ff0000;"> android:name="com.example.volleyHttp.volleyApplication"</span>

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

  不要忘记了添加网络权限!


4.StringRequest 的get和post方法


4.1 get 操作

  (1)实例化StringRequest 对象

(2)设置参数:请求方式,URL地址,成功的返回调用,失败的返回调用;

(3)给请求设置 tag,添加到刚才的请求队列 中!

[java] view
plaincopy

private void strRequest_get() {

StringRequest request = new StringRequest(Method.GET,

HttpPath.getSharedIfo(1), new Listener<String>() {

@Override

public void onResponse(String response) {

// TODO Auto-generated method stub

Toast.makeText(getApplicationContext(), response,

Toast.LENGTH_SHORT).show();

tv.setText(response);

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

Toast.makeText(getApplicationContext(),

error.getMessage(), Toast.LENGTH_SHORT).show();

}

});

request.setTag("strReqGet");

<span style="color:#ff0000;">volleyApplication.getQueue().add(request);</span>

}


4.2 post 操作

(1)实例化StringRequest 对象

(2)设置参数:请求方式,URL地址,成功的返回调用,失败的返回调用;

(3)Post提交的参数设置:重写 getParams 方法,返回Map集合,将自动调用;

(4)请求设置 tag,添加到刚才的请求队列 中!

[java] view
plaincopy

/**

* 01.2 String Requset post 提交数据

*/

private void strRequest_post(){

StringRequest stringRequest=new StringRequest(Method.POST,HttpPath.getSharedIfo_post(),new Listener<String>() {

@Override

public void onResponse(String response) {

// 成功返回数据

tv.setText(response);

}

},new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

//出错

Toast.makeText(getApplicationContext(),

error.getMessage(), Toast.LENGTH_SHORT).show();

}

}){

@Override

protected Map<String, String> getParams() throws AuthFailureError {

// post 提交 重写参数 ,将自动 提交参数

Map<String,String> map=new HashMap<String, String>();

map.put("id","2");

return map;

}

};

stringRequest.setTag("strPost");

volleyApplication.getQueue().add(stringRequest);

}



5.JsonObjectRequest 的 get和post方法


5.1 get 方法

(1)实例化JsonObjectRequest 对象

(2)设置参数:请求方式,URL地址,参数Jsonrequest 为 null (因为为get请求),成功的返回调用,失败的返回调用;

(3)给请求设置 tag,添加到刚才的请求队列 中!

(4)请求成功后,直接返回 成 JsonObject 对象 ,可以直接使用

[java] view
plaincopy

/**

* 02.jsonobjectRequert get请求

*/

private void jsonRequest_get(){

JsonObjectRequest objectRequest=new JsonObjectRequest(Method.GET,HttpPath.getSharedIfo(1),

null,new Listener<JSONObject>() {

@Override

public void onResponse(JSONObject response) {

//直接进行 json解析

try {

JSONObject jsonObject=new JSONObject(response.getString("data"));

tv.setText(jsonObject.getString("note"));

} catch (JSONException e) {

// TODO Auto-generated catch block

tv.setText(e.getMessage());

}

}

},new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

//请求失败返回的信息

tv.setText(error.getMessage());

}

});

objectRequest.setTag("jsonRequest");

volleyApplication.getQueue().add(objectRequest);

}


5.2 post 方法

(1)实例化JsonObjectRequest 对象

(2)设置参数:请求方式,URL地址,参数JsonRequest ,成功的返回调用,失败的返回调用;

(3)请求参数设置:通过 JsonObejct 实现 post提交 参数设置 (见示例代码)

(4)给请求设置 tag,添加到刚才的请求队列 中!

(5)请求成功后,直接返回 成 JsonObject 对象 ,可以直接使用

[java] view
plaincopy

/**

* 02.2 jsonObjectRequest post的方式 请求

*/

private void jsonRequest_post(){

<span style="color:#ff0000;"> //封装请求参数 </span>

JSONObject jsonStr=new JSONObject();

try {

jsonStr.put("id","2");

} catch (JSONException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Method.POST,HttpPath.getSharedIfo_post()

,jsonStr, new Listener<JSONObject>() {

@Override

public void onResponse(JSONObject response) {

// TODO Auto-generated method stub

JSONObject jsonObject;

try {

jsonObject = new JSONObject(response.getString("data"));

tv.setText(jsonObject.getString("note"));

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

},new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

// TODO Auto-generated method stub

tv.setText(error.getMessage());

}

});

jsonObjectRequest.setTag("jsonPost");

volleyApplication.getQueue().add(jsonObjectRequest);

}


6.JsonArrayRequest

这个我就不在累赘了,和 JsonObjectResquest 一样 , 只不过返回的是 JsonArray 类型!


7. 注意

RequestQueue 请求队列 在初始化的时候,一定要在 android 配置文件的Application 标签里进行注册!

使用的时候,注意 导入 包问题,ErrorListener 一定是 Response.ErrorListener;


8.ImageRequest

(1)实例化 ImageRequest 对象

(2)设置参数 :这里的HttpPath.getPic() 是 URL图片地址

(3)请求成功后,回调 bitmap对象 直接可以赋值给 ImageView

(4)需要在 请求处理队列中执行

(5)默认图片可以在加载前设置好,错误图片可以在出错的时候设置

[java] view
plaincopy

/**

* 03. imageRequest 请求一张图片

*/

private void imageRequest_get(){

ImageRequest imageRequest=new ImageRequest(HttpPath.getPic(),

new Response.Listener<Bitmap>() {

@Override

public void onResponse(Bitmap response) {

// TODO Auto-generated method stub

imageView1.setImageBitmap(response);

}

},0,0,Config.RGB_565,new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

// TODO Auto-generated method stub

tv.setText(error.getMessage());

}

});

imageRequest.setTag("iamgerequest");

volleyApplication.getQueue().add(imageRequest);

}


9. ImageLoader 的使用


9.1优点

(1) 可以设置 出错的时候,显示的图片和设置默认图片!

(2) 图片缓存的实现


9.2 无缓存实现 加载一张图片

[java] view
plaincopy

/**

* 4.imageloader ,无缓存的

* 优点是:图片缓存技术

*/

private void imageLoader_get(){

//设置 图片缓存 这里为 空的,没有使用 缓存

ImageCache cache=new ImageCache() {

@Override

public void putBitmap(String url, Bitmap bitmap) {

// 没有

}

@Override

public Bitmap getBitmap(String url) {

// 没有

return null;

}

};

//实例化对象

ImageLoader imageLoader=new ImageLoader(volleyApplication.getQueue(),cache);

// 图片监听 (默认图片,错误图片) 和 imageView

ImageListener imageListener=ImageLoader.getImageListener(imageView1,R.drawable.ic_launcher,R.drawable.ic_launcher);

//加载图片

imageLoader.get(HttpPath.getPic(),imageListener,0,0);

}


9.3 ImageLoader+LruCache 实现图片的加载和缓存

(1)实现ImageCache :这里新建一个类,继承自ImgaeCache

[java] view
plaincopy

package com.example.Util;

import android.annotation.SuppressLint;

import android.graphics.Bitmap;

import android.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

@SuppressLint("NewApi")

public class BitmapCache implements ImageCache{

//使用LruCache 实现图片缓存 :

//使用地址:

//http://blog.csdn.net/guolin_blog/article/details/9316683

private LruCache<String,Bitmap> cache;

//设置最大的 尺寸值

public BitmapCache() {

//构造方法 实现 LruCache 缓存 图片

int maxSize=10*1024*1024;

cache=new LruCache<String,Bitmap>(maxSize){

@Override

protected int sizeOf(String key, Bitmap value) {

return value.getRowBytes()*value.getHeight();

}

};

}

@Override

public Bitmap getBitmap(String url) {

// 得到

return cache.get(url);

}

@Override

public void putBitmap(String url, Bitmap bitmap) {

// 设置

cache.put(url, bitmap);

}

}

(2)下面实现调用即可:

[java] view
plaincopy

/**

* 4.2 将 imageLoader和 缓存联系在一起!

*/

private void imageLoader_cache(){

//设置 图片缓存 :体现 imageLoader的优势

//使用 LruBitmap + ImageCache 实现

//实例化对象

ImageLoader imageLoader=new ImageLoader(<span style="color:#ff0000;">volleyApplication.getQueue(),new BitmapCache()</span>);

// 图片监听 (默认图片,错误图片) 和 imageView

ImageListener imageListener=ImageLoader.getImageListener(imageView1,R.drawable.ic_launcher,R.drawable.ic_launcher);

//加载图片

imageLoader.get(HttpPath.getPic(),imageListener,0,0);

}


10.ImageLoader+NetWorkImageView 实现图片获取


(1)首先在布局文件里新添加 NetworkImageView 布局

[html] view
plaincopy

<com.android.volley.toolbox.NetworkImageView

android:id="@+id/network_image_view"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_gravity="center_horizontal"

/>


(2)初始化 控件

使用findViewByid 实现


(3)使用

这个方法是 传进来 图片名称,后通过Url 从服务器获取!很简单,需要实例化 ImageLoader;

[java] view
plaincopy

/**

* 4.3 使用networkImageView 加载图片

*/

private void networkImageview_get(String pic){

<span style="color:#ff0000;">ImageLoader imageLoader=new ImageLoader(volleyApplication.getQueue(),new BitmapCache());</span>

network_image_view.setDefaultImageResId(R.drawable.ic_launcher);

network_image_view.setErrorImageResId(R.drawable.ic_launcher);

network_image_view.setImageUrl(HttpPath.getBasicPath()+"/"+pic,imageLoader);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: