热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidvolley框架概述,,android框架volley详解

网络框架Volley(代码一起奉上)1.1Volley的特点1使网络通信更快,更简单,更健壮;2GetPost网络请求及网络图像的高效率异

网络框架 Volley(代码一起奉上)

1.1 Volley 的特点

1 使网络通信更快,更简单,更健壮;

2 Get/Post网络请求及网络图像的高效率异步请求;

3 可以对网络请求的优先级进行排序处理;

4 可以进行网络请求的缓存;

5 可以取消多级别请求;

6 可以和Activity生命周期联动

1.2 为什么要使用Volley?

功能上:

高效的Get/Post方式的数据请求交互;

网络图片的加载和缓存过程简单化。

其他:

谷歌官方推出的,比较权威(谷歌针对Android的网络平台通讯库)

对网络请求优化的非常好,非常权威

性能很稳定、强劲

2. Volley 的使用

2.1 首先建立 Volley 的全局请求队列

public class MyApplication extends Application {

public static RequestQueue queues;

@Override

public void onCreate() {

super.onCreate();

//实例化请求队列

queues = Volley.newRequestQueue(getApplicationContext());

}

// 暴露一个方法,用于获取这个请求队列

public static RequestQueue getHttpQueues(){

return queues;

}

}

//记得注册并加上网络权限

2.2 StringRequest,创建 volley_Get() 方法

private void volley_Get() {

String url = "http://192.168.1.46:8080/zhbj/categories.json";

StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener() {

@Override

public void onResponse(String s) {

//数据请求成功

Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError volleyError) {

//请求失败的情况

Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_SHORT).show();

}

});

request.setTag("volley_string_get");//与Activity联动的关键

MyApplication.getHttpQueues().add(request);//名字得有意义

}

2.3 jsonObjectRequest,创建 volley_Get2() 方法

因为这里是Get请求方式,第三个参数设置为null,post方式时传入附带参数的JsonObject

private void volley_Get2() {

String url = "http://192.168.1.46:8080/zhbj/categories.json";

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() {

@Override

public void onResponse(JSONObject jsonObject) {

Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_SHORT).show();

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError volleyError) {

Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_SHORT).show();

}

});

request.setTag("volley_jsonobject_get");

MyApplication.getHttpQueues().add(request);

}

2.4 StringRequest,创建 volley_post() 方法

注意 getParams() 这个传递数据的方法

public void bt_string_post(View view){

String url = "http://192.168.1.46:8080/zhbj/categories.json";

StringRequest request = new StringRequest(Request.Method.POST,

url, new Response.Listener() {

@Override

public void onResponse(String s) {

Toast.makeText(MainActivity.this, "请求成功", Toast.LENGTH_SHORT).show();

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError volleyError) {

Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();

}

}){

@Override

protected Map getParams() throws AuthFailureError {

Map hashMap = new HashMap<>();

hashMap.put("phone","110");

hashMap.put("key","lizi");

return hashMap;

}

};

request.setTag("volley_string_post");

MyApplication.getHttpQueues().add(request);

}

2.5 jsonObjectRequest 的 post 请求方式

public void bt_jsonobject_post(View view){

String url = "http://192.168.1.46:8080/zhbj/categories.json";

Map hashMap = new HashMap<>();

hashMap.put("phone","110");

hashMap.put("key","lizi");

JSONObject object = new JSONObject(hashMap);

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, object, new Response.Listener() {

@Override

public void onResponse(JSONObject jsonObject) {

Toast.makeText(MainActivity.this, "请求成功", Toast.LENGTH_SHORT).show();

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError volleyError) {

Toast.makeText(MainActivity.this, "接口不支持post,注定失败,用法正确", Toast.LENGTH_SHORT).show();

}

});

}

3. 与 Activity 生命周期的关联

@Override

protected void onStop() {

super.onStop();

MyApplication.getHttpQueues().cancelAll("volley_string_get");

}

4. Volley 的简单二次回调封装,方便全局控制,只需在ValleyInterface 中实现逻辑即可

4.1 这个类是请求成功与失败接口的回调,封装成功与失败两种抽象类

public abstract class ValleyInterface {

public Context mContext;

public static Response.Listener mListener;

public static Response.ErrorListener mErrorListener;

public ValleyInterface(Context context, Response.Listener listener,

Response.ErrorListener errorListener) {

// 进行事件的绑定

this.mCOntext= context;

this.mErrorListener = errorListener;

this.mListener = listener;

}

public abstract void onMySucess(String result);

public abstract void onMyError(VolleyError volleyError);

//实例化两种请求方法,两个回调示例

public Response.Listener loadingListener(){

mListener = new Response.Listener() {

@Override

public void onResponse(String arg0) {

onMySucess(arg0);

}

};

return mListener;

}

// 失败的回调方式

public Response.ErrorListener errorListener(){

mErrorListener = new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError volleyError) {

onMyError(volleyError);

}

};

return mErrorListener;

}

}

4.2 二次封装的类

public class ValleyRequest {

public static StringRequest stringRequest;

public static Context context;

public static void RequestGet(Context context,String url,String tag,ValleyInterface vif){

//最后一个是请求成功与失败接口的回调,这个接口涵盖成功与失败的回调,建立一个抽象类,封装这两个关键的方法

MyApplication.getHttpQueues().cancelAll(tag);//防止重复请求,消耗内存

stringRequest = new StringRequest(Request.Method.GET,url, vif.loadingListener(),vif.errorListener());

stringRequest.setTag(tag);

MyApplication.getHttpQueues().add(stringRequest);

MyApplication.getHttpQueues().start();

}

public static void RequestPost(Context context, String url, String tag, final Map params , ValleyInterface vif){

MyApplication.getHttpQueues().cancelAll(tag);

stringRequest = new StringRequest(url,vif.loadingListener(), vif.errorListener()){

@Override

protected Map getParams() throws AuthFailureError {

return params;

}

};

stringRequest.setTag(tag);

MyApplication.getHttpQueues().add(stringRequest);

MyApplication.getHttpQueues().start();

}

}

4.3 二次 回调之后的Get请求用法

private void bt2_get() {

String url = "http://192.168.1.65:8080/zhbj/categories.json";

ValleyRequest.RequestGet(this, url, "abcGet", new ValleyInterface(this,

ValleyInterface.mListener,ValleyInterface.mErrorListener) {

@Override

public void onMySucess(String result) {

Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();

}

@Override

public void onMyError(VolleyError volleyError) {

Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_SHORT).show();

}

});

}

5. Volley 加载图片

缓存功能及简单介绍

LruCache

ImageCache

加载网络图片和监听

ImageRequest

ImageLoader

NetworkImageView

public void loadImageByVolley(View v) {

String url = "http://www.baidu.com/img/bdlogo.png";

// 第二个参数是图片请求成功的回调,两个数字是图片宽高最大(会做压缩处理),全为零表示加载原图,

ImageRequest request = new ImageRequest(url, new Response.Listener() {

@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.setTag("load_image_volley");

MyApplication.getHttpQueues().add(request);

}

6.终极版 Volley 带缓存加载图片

imageCache 单独使用起不到缓存效果,结合LruCache

public class BitmapCache implements ImageLoader.ImageCache {

public LruCache cache;

public int max = 10*1024*1024; //最大为 10M 的缓存

public BitmapCache(){

cache = new LruCache(max){

@Override

protected int sizeOf(String key, Bitmap value) {

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

}

};

}

@Override

public Bitmap getBitmap(String s) {

return cache.get(s);

}

@Override

public void putBitmap(String s, Bitmap bitmap) {

cache.put(s,bitmap);

}

}

两种带缓存加载图片的Volley方法

public void loadImageByVolley3(View view){

ImageLoader imageLoader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());

ImageLoader.ImageListener listener = ImageLoader.getImageListener

(iv_img,R.mipmap.ic_launcher,R.mipmap.ic_launcher);

//加载及缓存网络图片

imageLoader.get(url,listener);

}

使用NetworkImageView的方法

android:layout_

android:layout_

android:layout_weight="1"

android:id="@+id/iv_img2"/>

networkImageView = (NetworkImageView)findViewById(R.id.iv_img2);

public void NetworkImageView(View view){

ImageLoader imageLoader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());

networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);

networkImageView.setErrorImageResId(R.mipmap.ic_launcher);

networkImageView.setImageUrl(url,imageLoader);

}



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
author-avatar
伊子夕2010_593
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有