利用Volley框架开发实战代码详解(快速开发,代码直接可以用在实战中...)

说到Volley,则需要了解Volley这个框架,这里我就不用多说了,博客有转载。。。。

这里我就直接上代码了:

并且有注释:

import java.net.URLDecoder;

import android.app.Dialog;
import android.content.DialogInterface;
import android.util.Log;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import com.microidea.util.Algorithm;
这个框架封装了request  需要继承它,自己写一个BaseRes<Data>  一定要继承request
public abstract class BaseRequest<Params, Data> extends Request<BaseRes<Data>>
		implements DialogInterface.OnCancelListener {
	 private static final String SERVER = "http://http://blog.csdn.net/lggisking";//服务器接口地址
	 private static final String KEY = "VOLLEY";//你应用的APP密钥

	private final Params mParams;
	private final Dialog mDialog;

	private final Listener<BaseRes<Data>> mListener;
	private final ErrorListener mErrorListener;

	public BaseRequest(int method, String url, Params params,
			Listener<BaseRes<Data>> listener, ErrorListener errorlistener) {
		this(method, url, params, listener, errorlistener, null);

	}

	public BaseRequest(int method, String url, Params params,
			Listener<BaseRes<Data>> listener, ErrorListener errorlistener,
			Dialog dialog) {
		super(method, getReqUrl(url, params), null);
		mParams = params;
		mDialog = dialog;
		mListener = listener;
		mErrorListener = errorlistener;
		if (mDialog != null) {
			mDialog.setOnCancelListener(this);
		}
	}

	private static String getReqUrl(String m, Object p) {
		try {
			String Params = Algorithm.DesEncrypt(JSON.toJSONString(p), KEY);
			String Sign = Algorithm.Md5Encrypt(KEY + "Method" + m + "Params"
					+ Params + KEY);
			return SERVER + "?" + "Method=" + m + "&Params=" + Params
					+ "&Sign=" + Sign;
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public void onCancel(DialogInterface dialog) {
		cancel();
	}

	@Override
	public Request<?> setRequestQueue(RequestQueue requestQueue) {
		if (mDialog != null && !mDialog.isShowing()) {
			mDialog.show();
		}
		return super.setRequestQueue(requestQueue);
	}

	@Override
	protected Response<BaseRes<Data>> parseNetworkResponse(
			NetworkResponse response) {
		String data = new String(response.data);
		Log.d("Request", "====================  ADDR  ====================\n"
				+ getUrl());
		Log.d("Request", "====================  PARAMS  ====================\n"
				+ JSON.toJSONString(mParams));
		try {

			BaseRes<Data> result = JSON.parseObject(data, getType()); //FastJson框架

			Log.d("Request",
					"==================== RESULT ====================\n" + data);
			if (result.verification) {
				return Response.success(result,
						HttpHeaderParser.parseCacheHeaders(response));
			} else {
				return Response.error(new AsError(result.error));
			}
		} catch (Exception e) {
			Log.d("Request",
					"==================== RESULT ====================\n" + data);
			Log.e("Request",
					"==================== ERRORS ====================", e);
			return Response.error(new DecryptError(e));
		}
	}

	@Override
	protected void deliverResponse(BaseRes<Data> response) {
		if (mListener != null && !isCanceled()) {
			mListener.onResponse(response);
		}
		if (mDialog != null && mDialog.isShowing()) {
			mDialog.cancel();
		}
	}

	@Override
	public void deliverError(VolleyError error) {
		if (!(error instanceof DecryptError) && !(error instanceof AsError)
				&& !isCanceled()) {
			Log.d("Request",
					"====================  ADDR  ====================\n"
							+ getUrl());
			Log.d("Request",
					"==================== PARAMS ====================\n"
							+ JSON.toJSONString(mParams));
			Log.e("Request",
					"==================== ERRORS ====================", error);
		}
		if (mErrorListener != null && !isCanceled()) {
			mErrorListener.onErrorResponse(error);
		}
		if (mDialog != null && mDialog.isShowing()) {
			mDialog.cancel();
		}
	}

	protected abstract TypeReference<BaseRes<Data>> getType();//通过请求来的JSON数据进行解析绑定到实体类

}
这个类的作用:一个泛型基类,每个请求类继承它,请求实体类传入相应的字段:
public class BaseRes<Data> {

	public boolean verification;
	public ArrayList<Data> data;

}

整个请求,绑定,,都在这一个类中完成

public class ReqPhoneCode extends
		BaseRequest<ReqPhoneCode.Params, ReqPhoneCode.Data> { /
	public ReqPhoneCode(Params params,
			Listener<BaseRes<Data>> listener, ErrorListener errorlistener) {
		super(Method.GET, "action", params, listener, errorlistener);
	}

	public ReqPhoneCode(Params params,
			Listener<BaseRes<Data>> listener, ErrorListener errorlistener,
			Dialog dialog) {
		super(Method.GET, "action", params, listener,
				errorlistener, dialog);
	}
//request的参数实体类
	public static class Params {
		public String mobile;
		public String type;
		public Params(String mobile, String type) {
			super();
			this.mobile = mobile;
			this.type = type;
		}

	}
//response实体类
	public static class Data {
		public  String code;
		public  String msg;
		public  String total;
	}

	@Override
	protected TypeReference<BaseRes<Data>> getType() {
		return new TypeReference<BaseRes<Data>>() {  
		};
	}

}

接下来就是在Activity如何去用Volley框架了,,上面已经做好了整个流程,接下来会非常的简单

很奇怪Response需要手动导入包:import com.android.volley.Response;

public class ActivityCode extends Activity implements OnClickListener,
		Response.Listener<BaseRes<ReqPhoneCode.Data>>, Response.ErrorListener {
	private Button bt_code;
	private EditText et_code;
	private RequestQueue queue;
	private Params paramCode;
	private ReqPhoneCode requestcode;
	private String mobileNum;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_code);
		bt_code = (Button) findViewById(R.id.bt_code);
		et_code = (EditText) findViewById(R.id.recode);

		bt_code.setOnClickListener(this);
		queue = Volley.newRequestQueue(this); //得到Voley对象
	}

	@Override
	public void onClick(View v) {
		requestCode();
	}

	private void requestCode() {
		mobileNum = et_code.getText().toString().trim();
		if (mobileNum.length() > 1) {
			paramCode = new ReqPhoneCode.Params(mobileNum, "");
			requestcode = new ReqPhoneCode(paramCode, this, this);
			queue.add(requestcode);//把整个请求加入到queue中  会得到两个方法<span style="font-family: Arial, Helvetica, sans-serif;">onErrorResponse()</span><span style="font-family: Arial, Helvetica, sans-serif;">onResponse()分别是请求错误 和 请求成功  :可在这两个方法中完成相应的处理</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span>

		} else {
			App.getInstance().Toast("请输入正确的手机号码");
		}
	}

	@Override
	public void onErrorResponse(VolleyError error) {
		App.getInstance().showError(error);
	}

	@Override
	public void onResponse(BaseRes<Data> response) {
		if (response.verification && response.total == 1) {
			Intent intent = new Intent(ActivityCode.this, ActivityRegist.class);
			intent.putExtra("code", response.data.get(0).code);
			intent.putExtra("number", mobileNum);
			startActivity(intent);
			finish();
		} else if (response.verification && response.total == 0) {
			 App.getInstance().Toast("获取验证码失败");

		}

	}
}

希望这篇文章对大家有用,还有什么什么有疑问的,可以留言....

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 14:13:54

利用Volley框架开发实战代码详解(快速开发,代码直接可以用在实战中...)的相关文章

超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享

原创不易,转载请注明出处:超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享 代码下载地址:http://www.zuidaima.com/share/1759689106541568.htm 依赖注入,DI(Dependency Injection),它的作用自然不必多说,提及DI容器,例如spring,picoContainer,EJB容器等等,近日,google诞生了更轻巧的DI容器--Guice! 废话不多讲了,先看看Guice是如何实现

Akka第一个案例动手实战main方法实现中ActorSystem等代码详解

学习了Akka第一个案例动手实战main方法实现中ActorSystem等代码详解,创建ActorSystem实例,用acterOf创建MasterActor,用tell的方式给MasterActor发信息,睡眠一段时间给MasterActor发信息,处理完后关闭,资源回收. 案例如下: public static void main(String[] args) throws Exception{ ActorSystem_system =  ActorSystem.create("HelloA

新书《Nginx实战:基于Lua语言的配置、开发与架构详解》开始发售

新书<Nginx实战:基于Lua语言的配置.开发与架构详解>开始发售https://item.jd.com/12487157.html#none <Nginx实战:基于Lua语言的配置.开发与架构详解>主要讲解了Nginx在反向代理和应用开发中的作用,阅读本书可以了解Nginx在互联网开发中扮演的多个角色,充分利用这些角色的各项功能有助于提升服务的整体性能.<Nginx实战:基于Lua语言的配置.开发与架构详解>所介绍的大部分功能是通过Nginx+Lua进行开发和配置的

JavaScript 开发规范要求详解

作为一名开发人员(We前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题.本人在开发工作中就曾与不按规范来开发的同事合作过,与他合作就不能用"愉快"来形容了.现在本人撰写此文的目的除了与大家分享一点点经验外,更多的是希望对未来的合作伙伴能够起到一定的借鉴作用.当然,如果我说的有不科学的地方还希望各路前辈多多指教.下面分条目列出各种规范要求,这些要求都是针对同事编码毛病提出来的,好些行业约定的其它规范可

Android开发之异步详解(二)之AsyncTask

请尊重他人的劳动成果,转载请注明出处:Android开发之异步详解(二)之AsyncTask http://blog.csdn.net/fengyuzhengfan/article/details/40212745 我曾在<Android开发之异步详解(一)之Thread+Handler>一文中介绍过通过Thread+Handler实现异步操作.感兴趣的朋友可以看一下. 虽然Thread+Handler可以实现更新主线程的UI并实现异步,但Thread+Handler模式需要为每一个任务创建一

Android开发之异步详解(一)Thread+Handler

请尊重他人的劳动成果,转载请注明出处:  Android开发之异步详解(一)Thread+Handler http://blog.csdn.net/fengyuzhengfan/article/details/40211589 在Android实际开发工程中经常会进行一些诸如:文件读写.访问网络等耗时的操作,这些耗时的操作是不建议放到UI线程里的.所以我们会新开一个线程,在子线程中进行这些耗时的操作,耗时操作过程中,UI经常需要更新,但Android是不允许在子线程中修改UI的.所以就出现了Th

20155326《网络对抗》免考项目—— 深入恶意代码之恶意代码详解

20155326<网络对抗>免考项目--深入恶意代码之恶意代码详解 什么是恶意代码 恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据.运行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 恶意代码生命周期 攻击目标: 个人计算机 服务器 移动智能终端 手机.平板等 智能设备 特斯拉汽车.智能家居.智能手表等 通信设备 路由器.交换机等 安全设备等 防火墙.IDS, IPS. VDS 攻击目标范围: 定点攻击 邮件.IP.域名.

tiny_cnn代码详解(3)——层间继承关系

在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系. 一.卷积神经网络快速入门 tiny_cnn作为卷积神经网络的一种实现形式,在探讨其框架结构之前,首先需要简要介绍一些卷积神经网络相关的知识.首先,给出经典卷积神经网络的网络结构: 这个是经典的LeNet-5的网络结构图,五层网络.最早用于支票上的手写数字识别,也是最早的商业化的深度学习模型.从上图中可以看出,卷积神经网络主

KMP算法详解(图示+代码)

算法过程非常绕,不要企图一次就能看明白,多尝试就会明白一些.下面试图用比较直观的方法解释这个算法,对KMP算法的解释如下: 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止. 4. 接着比较字符串和搜索词的下一个字符,还是相同. 5. 直到字

详解iOS开发之自定义View

iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加一个Hypnosister的类,这个类选择继承UIObject.修改这个类,使他继承:UIView @interface HypnosisView : UIView 自定义View的关键是定义drawRect: 方法,因为主要是通过重载这个方法,来改变view的外观.例如,可以使用下面代码绘制一个很