androidvolley源码
Ⅰ android volley https请求超时怎么解决
把demo源码中的toolsbox下的一些通用类复制到自己项目下,包括:
SslHttpClient.java,SslSocketFactory.java,SsX509TrustManager.java,ExtHttpClientStack.java
还要把libs目录下的khandroid-httpclient-4.2.3.jar复制到自己项目的libs下并且引用
demo源码中包含了一个Https的例子,非常简单:
[java] view plain
// ReplaceR.raw.test with your keystore
InputStream keyStore =getResources().openRawResource(R.raw.test);
// Usually getting the request queueshall be in singleton like in {@see Act_SimpleRequest}
// Current approach is used just for brevity
RequestQueue queue = Volley
.newRequestQueue(Act_SsSslHttpClient.this,
new ExtHttpClientStack(new SslHttpClient(keyStore,"test123", 44401)));
StringRequest myReq = new StringRequest(Method.GET,
"https://ave.bolyartech.com:44401/https_test.html",
createMyReqSuccessListener(),
createMyReqErrorListener());
在这个代码中可以看到,需要一个加密过的证书(在demo的raw目录下的一个bks文件)和这个加密密码,还有服务端提供的https的端口号。
下面我们来看怎么生成这个加密过的证书文件。
1. 首先,需要一个加密工具Bouncy Castle,
在SIGNED JAR FILES下面选择对应的jar包来下载,要对应电脑所安装的jdk的版本。在这里,我使用的是bcprov-jdk15on-152.jar
2. 为了方便,把服务端的ssl证书文件和这个jar包放在同一个目录,打开终端(windows下打开cmd),输入下面的代码:
keytool -importcert -v -trustcacerts -file "server_cert.crt(服务端SSL证书文件名+后缀名)" -alias 你的app包名 -keystore "my.bks(目标生成的bks文件,文件名称随便取,后缀名为bks)" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath"bcprov-jdk15on-152.jar" -storetype BKS
过一会终端会提示输入密码,这个是加密证书的密码,我们代码中需要用到,切记这个密码,不然又要重新操作。输入两次密码结束,终端继续问,是否信任此证书,输入:y,然后回车,加密证书就生成完毕。
3. 然后把这个生成出来的my.bks放在自己项目的raw目录下,再把volley demo的https的例子代码复制过去,修改加密证书的名字和密码就可以跑了。还需要注意的是,请求的url必须是域名而不是服务器的ip地址。
但是有一个问题,通常我们测试都是在测试环境下进行,而SSL证书跟域名是绑定的。这个时候我们还需要用到模拟器,修改模拟器的hosts。模拟器的host位于/system/etc目录下。首先要把这个hosts pull出来,然后我们修改这个文件,例如加一行 192.168.232.12 www.hicsg.com,然后保存。
如果这个时候直接把修改好的hosts push回去,可能会出现out for memery的错误。这个时候,我们需要关闭模拟器,然后打开终端,输入:
emulator -avd Nexus_4_Edited_API_17(这里是模拟器的名称)-partition-size 1024
此时,终端会自动启动一个新的模拟器,并且按照内存是1024MB来执行。启动成功,还需要新启动一个终端,输入:
root remount
否则会报错,原因没有root权限。
root完了,才可以把修改好的hosts push进去。push 成功后,运行我们自己的项目就可以调试https的请求了。
注意:这样的修改模拟器的hosts只是临时的,当模拟器被关闭了,重新再次被启动,模拟器会还原为默认状态,hosts还是原来的。
Ⅱ 如何去阅读Android Volley框架源码
创建一些react-native依赖的一些模块,在package.json文件的scripts属性中添加:[javascript]viewplain"start":"nodenode_moles/react-native/local-cli/cli.jsstart"注:如果scripts中存在其他键值对,则以逗号为分隔符。在mole的根目录创建index.android.js文件,并将一下内容下入index.android.js文件:[javascript]viewplain'usestrict';importReactfrom'react';import{AppRegistry,StyleSheet,Text,View}from'react-native';classHelloWorldextendsReact.Component{render(){return(Hello,World)}}varstyles=StyleSheet.create({container:{flex:1,justifyContent:'center',},hello:{fontSize:20,textAlign:'center',margin:10,},});AppRegistry.registerComponent('HelloWorld',()=>HelloWorld);在AndroidStudio中,在moudle的build.gradle文件中添加一下内容:[javascript]viewplainallprojects{repositories{maven{//AllofReactNative(JS,Androidbinaries)isinstalledfromnpmurl"$rootDir/node_moles/react-native/android"}}}在AndroidManifest.xml文件中添加网络访问权限(仅在开发或调试中需要该权限):
Ⅲ 如何在Android开发中高效使用Volley网络框架
Volley是Google在Google I/O 2013上发布的一个网络框架,主要功能:web接口请求,网络图片异步下载,支持缓存。volley只是定义了缓存以及Request的接口,具体实现可以自己定义,例如lru磁盘缓存,内存缓存,下载图片的ImageRequest.
Volley的源代码里包含了一些实现,都在com.android.volley.toolbox包里,包括磁盘缓存、json请求,图片请求。还定义了一个继承自ImageView的NetworkImageView,可以异步载入网络图片。
Ⅳ android volley框架淘汰了吗
淘汰策略一般是通过数量或者容量限制。每写一个app都自成一套。此外,一旦我们脱离了程序,我们将不再获得我们Bitmap的元数据,比如请求网络链接,资源描述符等等,而且对于同一个网络请求我们要用单独的装饰器来拦截。当然,之所以列举这些出来,是因为在Volley里面已经很好的解决了这些问题,当你下载了Volley的源码编译以后,你会发现,Volley所涵盖的功能远比你考虑的要多。而且这些东西,已经被很好的封装起来。而且Volley的代码读起来也非常的顺口,并不像Android原生的一些代码一样又臭又长。如果说Volley是一种好的开源框架,不如说Volley是一套现在看起来还不错的设计模式。而且从Volley所提供的有些接口来说,Volley已经将很大部分封装在框架内部,对于api调用者来说,无疑是个福音。
Ⅳ android volley怎么用
//volley挺简单的,
//先把volley的jar包导进你的工程里然后用我的这个方法试试
//我工程里的一个方法
privatevoidgetJSONByVolley(){
RequestQueuerequestQueue=Volley.newRequestQueue(this);
=ProgressDialog.show(this,null,"Loading...");//进度条
StringRequeststringRequest=newStringRequest(url,
newResponse.Listener<String>(){
@Override
publicvoidonResponse(Stringresponse){
//这个JSONUtils一个集成框架,用其他方法解析json一样的
Stringbody=JSONUtils.getString(response,"body","");
Gsongson=newGson();
list=newArrayList<模型>();
list=gson_point.fromJson(mpoint,
newTypeToken<List<模型>>(){
}.getType());
Gsongson_yx=newGson();
myx_list=newArrayList<模型>();
myx_list=gson_yx.fromJson(myx,
newTypeToken<List<模型>>(){
}.getType());
getBtnState(myx_list);
dataAdapter=newDataAdapter(ControlBoxActivity.this,list);
listView_data.setAdapter(dataAdapter);
if(progressDialog.isShowing()&&progressDialog!=null){
progressDialog.dismiss();
}
}
},newResponse.ErrorListener(){
@Override
publicvoidonErrorResponse(VolleyErrorerror){
Log.e("TAG",error.getMessage(),error);
Toast.makeText(ControlBoxActivity.this,"请检查您的网络",Toast.LENGTH_LONG).show();
if(progressDialog.isShowing()&&progressDialog!=null){
progressDialog.dismiss();
}
}
});
requestQueue.add(stringRequest);
}
Ⅵ android volley怎样进一步封装
Request可不单单只做了这么一件事情。为了证明他为什么是最核心的类,我再列举几个他做了的貌似跟他不相关的事情。
abstract protected void deliverResponse(T response);
public void deliverError(VolleyError error)
有木有震惊的赶脚,是的,最后response以及error的分发的实际执行者也是Request。所以这个Request类是贯穿一个请求到响应过程自始至终的类。这个其实不难理解,最后一步的分派工作需要一定的信息来保证分派的正确性,而最能提供这些信息的,其实就是最初我们发出的request了。
简单的介绍下Request如何使用:
从源码可以看出 getUrl 是返回的 url地址,getBody是返回的请求参数,这两个方法是在http的实际请求中肯定要用到的,使用get请求的话是需要保证getUrl的返回值正确即可,而使用post的话还要保证后面一个方法的返回值正确。(返回值如何注入就是你们的事情了,构造函数注入也可,set 方法注入也可)这里需要给大家注意的地方原生态的Stringrequest 没有重写 getBody 方法,也就是说 getBody 返回为null,那么 volley将默认使用get请求,如果大家想用post请求并使用Stringrequest的话,请重写这个方法。
另外还有两个很重要的类,请大家在构造request的时候务必要注入,ErrorListener 和 Listener,一个是用来处理error(public void onErrorResponse(VolleyError error))的,一个是用来处理正常返回的(public void onResponse(T response))这两个接口的定义都在Response类中。不难想出上面我所说的两个方法abstract protected void deliverResponse(T response)和public void deliverError(VolleyError error) 的实现其实就是调用这两个接口各自的方法就可以了。
有些附加的条件我们可以酌情的考虑是否需要实现。
public String getCacheKey(),CacheKey是volley从Request获取的用于本地存储请求数据的键值,相信大家很快能明白,如果两个request的这个方法返回的值一样的话,后者将能够有机会取到前者存储在本地的数据,从而减少了网络请求。原生态的Request是使用url为cechekey,这样并不一定科学,有本地存储需求的童鞋,请切记重写此方法。当然前提是保证 public final boolean shouldCache()返回为true。否则前功尽弃。
public void setRetryPolicy(RetryPolicy retryPolicy),从字面意思就可以看出,这个是对一个request的重新请求策略的设置,不同的项目是否需要重新请求,重新请求几次,请求超时的时间,这些就在这设置到里面。一般放就是继承RetryPolicy 类,根据自己的需求实现父类方法。
Ⅶ android+retrofit+和+volley+哪个好
volley吧,拓展度高,官方出的可靠些,源码可以看下,面试的时候可以吹些逼
Ⅷ android volley 和httpurlconnection 可以一起用吗
可以一块使用。首先Volley源码里面的网络请求部分在高于某一版本(好像是8,具体忘了)时会采用HttpUrlConnection,否则采用HttpClient,目前绝大多数设备是高版本的,并且SDK 23摒弃了HttpClient。强调一点,可以一块使用。
Ⅸ android 使用volley时怎样改变参数的encode编码
IE、Firefox、Opera三种浏览器对URL的传输的处理各不相同,浏览器在传输URl时得对URL进行编码,IE默认是以UTF-8来传输的,Opera可能也是以UTF-8编码的,Firefox经过测试肯定不是以UTF-8来编码的,有可能是以ISO-8859-1来编码的。所以如果不对中文进行处理,那么中文字符经各个浏览器以自己的编码方式传输到服务器后就出现了各种编码方式,而服务器却只能以一种编码方式来对接收到的URL进行解码。这样的话,和服务器使用的编码方式一样的浏览器在使用带中文的URl时不会出现问题,其他的浏览器则会出现问题。
所以解决的办法就是在URL进行传输之前对其中的中文进行编码,使用的编码是和服务器一样的编码,假设服务器使用的编码是UTF-8,则编码语句如下:URLEncoder.encode("中文","UTF-8")。这样对中文进行编码后所有的浏览器都不会再用他们默认的编码方式对中文进行编码,因为此时浏览器看到的已经不是中文了,而是编码后的字节码。这样就避开了浏览器传输URL时编码的差异性问题。
对中文参数问题的解决方式和上面一样。但这里所指的中文参数是指以?name="中文参数"方式附在URL后,以get方法传输到服务器的这种形式,并不是以表单形式提交到服务器的。各浏览器对中文参数的处理方式和各自对URL中中文的处理方式都不相同,各浏览器之间也有差异,有的在传输之前不进行编码,有的在传输之前就已经进行了编码,情形非常复杂。
但是我们以不变应万变,都用URLEncoder.encode("中文","UTF-8")对中文参数进行编码,这样不管各浏览器怎样对中文参数进行处理,此时经过我们编码后的中文对浏览器来说就是字节码,与a、b、c等字母没有什么区别。但是服务器会用UTF-8编码形式来还原中文参数。
总结一下:以Tomcat服务器为例,在中添加URIEncoding="UTF-8",设置tomcat以utf-8的编码方式来处理URL。其次,对URL中的中文和中文参数都用URLEncoder.encode("中文","UTF-8")进行编码。
再有,就是在后台进行转码。
点击后打开新页面,用户登录!用户名为中文时,火狐、google浏览器无问题,但IE有乱码问题:
问题代码:
Java代码
<a href="member!sysLogin.do?name='${member.uname }'" target="_blank" />登录</a>
超链接形式的传参,都是Get方式!
Java代码
public String sysLogin(){
try{
name=new String(name.getBytes("iso-8859-1"),"utf-8");
int r = this.memberManager.loginbysys(name);
if(r==1){
return "syslogin";
}
this.msgs.add("登录失败");
}catch(RuntimeException e){
this.msgs.add(e.getMessage());
} catch (UnsupportedEncodingException e) {
this.msgs.add(e.getMessage());
}
return this.MESSAGE;
}
修改成功:
Java代码
<a href="javascript:toSysLogin('${member.uname }');" />登录</a>
function toSysLogin(name){
var uriname="member!sysLogin.do?name="+name;
window.open( encodeURI(uriname));
}
Ⅹ android面试看过哪些源码
网络库volley,OkHttp,Retrofit,图片库Universal Image Loader、Glide、异步加载库RxJava、热修复库Tinker等等,把项目中用到的第三方库看看就行了。