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] viewplaincopy
/**
* 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] viewplaincopy
<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);
}
相关文章推荐
- HTTP协议
- 运输层TCP协议详细介绍
- 使用shiro的session后,HttpSession.getServletContext() 获取一直是null的解决方法
- 网络编程基础
- HTTP 错误 500.19 - Internal Server Error
- [转]其实你不懂wget的心 http://www.cnblogs.com/cbscan/articles/2276817.html
- redhat5在VM下无法连接网络--host-only类型
- 配置基于http的yum源
- 企业使用网络电话,节约通话成本
- VirtualBox Host-Only CentOS7 Mac Windows vboxnet0 网络共享
- Python中http请求方法库汇总
- 随手记之TCP Keepalive笔记
- 网络 tcp连接中的socket 端口 / tcp 数据包数据查看
- Forward a TCP port to another IP or port using NAT with Iptables
- 详解Nginx中HTTP的keepalive相关配置
- TDSTCPServerTransport 的Filters
- 2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)
- 2015合肥网络赛 HDU 5492 Find a path 动归
- 2015上海网络赛 HDU 5478 Can you find it 数学
- 2015上海网络赛 HDU 5475 An easy problem 线段树