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等等,把項目中用到的第三方庫看看就行了。