XUtils3.0+ 关于网络请求使用的一些相关整理


最近一段时间xutils已经升级到3.3.34了,由于android6.0移除掉了HttpClient的API,所以xutils在3.0+以上的版本改为对HttpUrlConnection进行封装,而android4.4之后HttpUrlConnection是基于最近比较流行的okhttp进行实现的。


       介绍完了一些相关的背景,现在就进入正题吧,这里只对xutils3.0+的网络请求做些简单的介绍,萌生这想法是由于xutils的作者提供的demo中一些网络请求,比如说下载就跟数据库混在一起,并没有单独拆开,因此在这里只讲解xutils在网络请求的使用。


需要的权限
<uses-permissionandroid:name="android.permission.INTERNET" /> 
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

初始化

// 在application的onCreate中初始化

@Override

public void onCreate() {

 super.onCreate();

    x.Ext.init(this);

    x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.

     ...

}


简单的版本

1.Get请求

RequestParams params = new RequestParams("https://www.baidu.com/");	// 网址(请替换成实际的网址)
	    params.addQueryStringParameter("key", "value");	// 参数(请替换成实际的参数与值)
	    
		x.http().get(params, new CommonCallback() {

			@Override
			public void onCancelled(CancelledException arg0) {
				
			}

			// 注意:如果是自己onSuccess回调方法里写了一些导致程序崩溃的代码,也会回调道该方法,因此可以用以下方法区分是网络错误还是其他错误
			// 还有一点,网络超时也会也报成其他错误,还需具体打印出错误内容比较容易跟踪查看
			@Override
			public void onError(Throwable ex, boolean isOnCallback) {
				
		        Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
		        if (ex instanceof HttpException) { // 网络错误
		            HttpException httpEx = (HttpException) ex;
		            int responseCode = httpEx.getCode();
		            String responseMsg = httpEx.getMessage();
		            String errorResult = httpEx.getResult();
		            // ...
		        } else { // 其他错误
		            // ...
		        }
				
			}

			// 不管成功或者失败最后都会回调该接口
			@Override
			public void onFinished() {	
				
			}

			@Override
			public void onSuccess(String arg0) {
				
			}
		});

2.Post请求

	RequestParams params = new RequestParams("https://www.baidu.com/");	// 网址(请替换成实际的网址)
	    params.addBodyParameter("key", "value");	// 参数(请替换成实际的参数与值)
	    
		x.http().post(params, new CommonCallback() {

			@Override
			public void onCancelled(CancelledException arg0) {
				
			}

			// 注意:如果是自己onSuccess回调方法里写了一些导致程序崩溃的代码,也会回调道该方法,因此可以用以下方法区分是网络错误还是其他错误
			// 还有一点,网络超时也会也报成其他错误,还需具体打印出错误内容比较容易跟踪查看
			@Override
			public void onError(Throwable ex, boolean isOnCallback) {
				
		        Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
		        if (ex instanceof HttpException) { // 网络错误
		            HttpException httpEx = (HttpException) ex;
		            int responseCode = httpEx.getCode();
		            String responseMsg = httpEx.getMessage();
		            String errorResult = httpEx.getResult();
		            // ...
		        } else { // 其他错误
		            // ...
		        }
				
			}

			// 不管成功或者失败最后都会回调该接口
			@Override
			public void onFinished() {	
				
			}

			@Override
			public void onSuccess(String arg0) {
				
			}
		});

get的post的请求基本一致,也就添加参数的方法不同而已。调用get方法,添加参数是用addQueryStringParameter。调用post方法,添加参数是用addBodyParameter。


3.传json字符串

	RequestParams params = new RequestParams(
				Constant.POST_WRITE_TEST_REPORT);
	params.setAsJsonContent(true);
	// 设置要传给后台的json字符串
	params.setBodyContent(paramJsonObject.toString());	

	x.http().post(params, new CommonCallback() {

			……
		});

除了设置json字符串所调动的方法不同外,该怎么调用还是怎么调用,就是如此简单。


4.获取Cookies,并且带给后台

xutils3.0+默认在访问时会将cookies和sessionId保存下来,并在下次访问时一并传给后台,但若是用户把程序退出后,重新进行访问就会保存最新的cookies与sessionId,会导致sessionid有可能导致不一致的情况,这种情况下我们可以自己保存下cookies与sessionId并在每次请求后台接口时传递过去。

比如在登陆成功后保存下cookies与session

		x.http().post(params, new CommonCallback() {

			……

			@Override
			public void onSuccess(String arg0) {
				// 保存cookie的值
				DbCookieStore instance = DbCookieStore.INSTANCE;
				List cookies = instance.getCookies();
				for (int i = 0; i < cookies.size(); i++) {
					HttpCookie cookie = cookies.get(i);
					if (cookie.getName() != null
						&& cookie.getName().equals(Constant.COOKIE_NAME)) {
						SPUtil.putString(mContext.getApplicationContext(),
							Constant.COOKIE_NAME, cookie.getValue());
					}

					if (cookie.getName() != null && cookie.getName().equals(Constant.COOKIE_SESSION)) {
					SPUtil.putString(mContext.getApplicationContext(),
						Constant.COOKIE_SESSION, cookie.getValue());
					}
					LogUtils.sysout(TAG + ": cookie name --> " + cookie.getName());
					LogUtils.sysout(TAG + ": cookie value --> " + cookie.getValue());
				}
			}
		});

在使用时把cookies与session传给后台

	StringBuilder sbCookie = new StringBuilder();
	sbCookie.append(Constant.COOKIE_NAME).append("=")
	.append(SPUtil.getString(context.getApplicationContext(),
				Constant.COOKIE_NAME)).append("; path=/; domain=")
				.append(Constant.DOMAIN);
	params.addHeader("Cookie", sbCookie.toString());

	StringBuilder sbSession = new StringBuilder();
	sbSession.append(Constant.COOKIE_SESSION).append("=")
	.append(SPUtil.getString(context.getApplicationContext(),
			Constant.COOKIE_SESSION)).append("; path=/; domain=")
				.append(Constant.DOMAIN);
	params.addHeader("Cookie", sbSession.toString());

		x.http().post(params, new CommonCallback() {

			……
		});

好了,就是这么简单,调用addHeader,往Cookie添加进去即可。虽然addHeader的是同一个key值Cookie,但会追加上去而不是覆盖,所以不用担心。


5.上传文件

	RequestParams params = new RequestParams(Constant.UPLOAD_TEST_REPORT_PIC);	// 上传文件的接口
	params.setMultipart(true);
	params.addBodyParameter("file", uploadFile);
	x.http().post(params, new CommonCallback() {
		……
	});

6.下载文件

	RequestParams params = new RequestParams(url);	// 文件在服务器上的存放路径
	params.setAutoResume(true);		// 是否使用断点下载
	params.setAutoRename(false);	// 下载后是否根据文件的属性自动命名
	params.setSaveFilePath(downPath.toString());	// 文件的本地保存路径
//	params.setExecutor(executor);	// 可以通过该方法设置下载的线程数
	// 为请求创建新的线程, 取消时请求线程被立即中断; false: 请求建立过程可能不被立即终止
	params.setCancelFast(true);
	x.http().get(params, new DownloadCallback(){
	        	
	     @Override
	     public void onStarted() {
	        super.onStarted();
	     }
	        	
	     @Override
	     public void onSuccess(File result) {
	        super.onSuccess(result);
	     }
	        	
	     @Override
	     public void onError(Throwable ex, boolean isOnCallback) {
	      	super.onError(ex, isOnCallback);
	        		
	     }
	        	
	     @Override
	     public void onLoading(long total, long current,
	        			boolean isDownloading) {
	        super.onLoading(total, current, isDownloading);
	 
	     }
	 });
最后贴上xutils3.0+在github上的 地址


你可能感兴趣的:(Android)