android封裝okhttp
㈠ 安卓怎麼封裝okhttp的post請求
你的參數沒有傳遞,參數通過httppost.setEntity(mpEntity)設置。 至於mpEntity你可以自己封裝。如果你直接傳一串json格式的字元串,可以這樣 Map<String, String> params = new HashMap<String, String>(); params.put(key, obj.toString); key是你的參數名,obj就是你的參數。 如果你的參數名是tel,那你的參數值就是123了,此時傳的就是json了。
㈡ okhttp,retrofit,android-async-http,volley應該選擇哪一個
個人認為okhttp是android平台最好的網路庫。
volley是一個簡單的非同步http庫,僅此而已。缺點是不支持同步,這點會限制開發模式;不能post大數據,所以不適合用來上傳文件。
android-async-http,與volley一樣是非同步網路庫。但volley是封裝的httpUrlConnection,它是封裝的httpClient,而android平台不推薦用HttpClient了,所以這個庫已經不適合android平台了。
okhttp是高性能的http庫,支持同步、非同步,而且實現了spdy、http2、websocket協議,api很簡潔易用,和volley一樣實現了http協議的緩存。picasso就是利用okhttp的緩存機制實現其文件緩存,實現的很優雅,很正確,反例就是UIL(universal image loader),自己做的文件緩存,而且不遵守http緩存機制。
retrofit與picasso一樣都是在okhttp基礎之上做的封裝,項目中可以直接用了。
另外AndroidAsync這個網路庫使用了nio的方式實現的。okhttp沒有提供nio的方式,不過nio更適合大量連接的情況,對於移動平台有點殺雞用牛刀的味道。picasso、uil都不支持inbitmap,項目中有用到picasso的富圖片應用需要注意這點。
㈢ android的okhttp是怎麼實現的
(一)Http Get
對了網路載入庫,那麼最常見的肯定就是http get請求了,比如獲取一個網頁的內容。
//創建okHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//創建一個Request
final Request request = new Request.Builder()
.url("https://github.com/hongyangAndroid")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//請求加入調度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
}
@Override
public void onResponse(final Response response) throws IOException
{
//String htmlStr = response.body().string();
}
});
21222324
以上就是發送一個get請求的步驟,首先構造一個Request對象,參數最起碼有個url,當然你可以通過Request.Builder設置更多的參數比如:header、method等。
然後通過request的對象去構造得到一個Call對象,類似於將你的請求封裝成了任務,既然是任務,就會有execute()和cancel()等方法。
最後,我們希望以非同步的方式去執行請求,所以我們調用的是call.enqueue,將call加入調度隊列,然後等待任務執行完成,我們在Callback中即可得到結果。
看到這,你會發現,整體的寫法還是比較長的,所以封裝肯定是要做的,不然每個請求這么寫,得累死。
ok,需要注意幾點:
onResponse回調的參數是response,一般情況下,比如我們希望獲得返回的字元串,可以通過response.body().string()獲取;如果希望獲得返回的二進制位元組數組,則調用response.body().bytes();如果你想拿到返回的inputStream,則調用response.body().byteStream()
看到這,你可能會奇怪,竟然還能拿到返回的inputStream,看到這個最起碼能意識到一點,這里支持大文件下載,有inputStream我們就可以通過IO的方式寫文件。不過也說明一個問題,這個onResponse執行的線程並不是UI線程。的確是的,如果你希望操作控制項,還是需要使用handler等,例如:
@Override
public void onResponse(final Response response) throws IOException
{
final String res = response.body().string();
runOnUiThread(new Runnable()
{
@Override
public void run()
{
mTv.setText(res);
}
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
我們這里是非同步的方式去執行,當然也支持阻塞的方式,上面我們也說了Call有一個execute()方法,你也可以直接調用call.execute()通過返回一個Response。
㈣ android有幾種請求方式okhttp restful
這個問題有點問題,這並不是三種方式,okhttp只是對網路訪問的一個更高層的封裝,httpURLConnection和httpClient是具體兩種實現訪問的方式。
㈤ Android okhttp面試的時候怎麼回答,盡量簡單一點又能說明9問題
封裝只是為了能更加簡單,僅此而已~功能UI線程切換可選擇的Callback(任意選擇UI線程或者子線程)參數規范化,GET與POST都一樣的傳參方式上傳/下載進度回調可以簡單的設置Head部分可以每次請求時自動加上需要的參數String/JSON/byte/File…都能一樣簡單用法由於輔助代碼較多,在這里就不一一貼出來了,在這里僅僅演示如何使用。非同步GETHttp.getAsync("/weather_mini",newUiCallback(){@OverridepublicvoidonFailure(Requestrequest,Responseresponse,Exceptione){log("getAsync:onFailed");}@OverridepublicvoidonSuccess(Stringresponse,intcode){log("getAsync:onSuccess:"+response);}},newStrParam("citykey",101010100));123456789101112由於是get請求,在這里參數中的citykey會被自動解析到url中。/weather_mini?citykey=1010101001同步GETfinalStringurl="/weather_mini?citykey=101010100";Stringstr=Http.getSync(String.class,url);log("getSync1:"+str);str=Http.getSync(url,newThreadCallback(){@OverridepublicvoidonFailure(Requestrequest,Responseresponse,Exceptione){log("getSync2:onFailed");}@OverridepublicvoidonSuccess(Stringresponse,intcode){log("getSync2:onSuccess:"+response);}});log("getSync2:"+str);12345678910111213141516同步方式支持兩種情況,一種有Callback,一種是沒有。當然就算加上了Callback也並不是非同步,此時方法會等到執行完成後才會繼續往下走。之所以這么干,是為了方便在callback中直接處理ui的事兒。在這里有必要說明一下,返回類型需要進行指定,如果沒有Callback哪么需要你傳入返回類型class。當然如果你傳入了callback,哪么此時class就由callbackAccountaccount=Http.getSync(Account.class,url);Useruser=Http.getSync(User.class,url);Stringstr=Http.getSync(String.class,url,newStrParam("citykey",101010100));123Callback的情況也如上所示。非同步與同步的區別在於方法名稱:Http.getSync()Http.getAsync()Http.postSync()Http.postAsync()Http.uploadSync()Http.uploadAsync()Http.downloadSync()Http.downloadAsync()默認情況下,upload與download具有callProgress回調進度功能。POSTStringvalue1="xxx";Stringvalue2="xxx";Stringurl="";Http.postAsync(url,newHttpCallback(){@OverridepublicvoidonFailure(Requestrequest,Responseresponse,Exceptione){e.printStackTrace();}@OverridepublicvoidonSuccess(Stringresponse,intcode){log(response);}},newStrParam("value1",value1),newStrParam("value2",value2));1234567891011121314151617post的請求方法與get基本如出一轍。UploadFilefile=getAssetsFile();Http.uploadAsync("/upload.php","uploadimg",file,newUiCallback(){@OverridepublicvoidonProgress(longcurrent,longcount){super.onProgress(current,count);log("uploadAsynconProgress:"+current+"/"+count);mUpload.setProgress((int)((current*100.00/count)));}@OverridepublicvoidonFailure(Requestrequest,Responseresponse,Exceptione){e.printStackTrace();log("uploadAsynconFailed");}@OverridepublicvoidonSuccess(Stringresponse,intcode){log("uploadAsynconSuccess:"+response);}});上傳部分也很簡單,如果需要帶有參數哪么和Post的使用方式一樣。當然此時傳入參數就不是StrParam而是IOParam.上傳的時候你可以僅僅傳遞文件+文件對應的name;或者傳遞IOParam;也可以StrParam+IOParam的方式;當然終極一點你可以傳遞:Param類型。
㈥ android okhttp框架有幾個模塊
大的模塊:okhttp 和 okio
okhttp 里還有:OkHttpClient, 攔截器,Requrst, Response, Dispatcher 等復雜概念
如果使用 OkHttp 的話推薦使用 基於它封裝的框架,比如 OkHttps :
http://okhttps.ejlchina.com/
這些框架非常好用,還要很多開箱即用的功能
㈦ android okhttp超時怎麼辦
OkHttp是一個在開發可汗學院AndroidAPP過程中非常重要的依賴庫。它的默認的配置為我們提供了非常重要實用功能,下面一些步驟我們可以讓Okhttp提供功能使用靈活和內省能力。1.啟用文件系統上的響應緩存默認情況下,Okhttp不支持響應緩存,包括HTTPCache-Control頭允許緩存響應。因此,客戶端通過一次又一次的請求相同的資源浪費時間和帶寬。而不是簡單地讀取初始響應後緩存的副本。要在文件系統中啟用響應緩存,需要配置com.squareup.okhttp.Cache實例,並把它傳遞給你的OkHttpClient實例的setCache方法。你必須初始化緩存與存放目錄的文件,並以位元組為單位的最大值。響應返回數據可以寫入給定目錄文件,如果一個響應的緩存超過了給定的大小。我們可以採取LRUpolicy。我們可以在stackoverflow查看JesseWilson的回復。我們可以通過context.getCacheDir()在子目錄中緩存我們的響應://Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}//Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}在可汗學院的程序中我們指定HTTP_RESPONSE_DISK_CACHE_MAX_SIZEas10*1024*1024,or10MB的大小2.集成StethoStetho是Facebook的一個可愛的庫,可以使用Chrome瀏覽器的Chrome開發人員工具功能來檢查你的Android應用程序。Stetho除了允許你檢查你的應用程序的SQLite資料庫,還可以查看View的層次結構。允許你檢查由OkHttp發起的每個請求和響應:這種自省機制是確保伺服器返回允許資源緩存的HTTP頭是非常有用的,以及驗證沒有請求時,保證緩存的資源存在。要想使用Stetho,只需添加一個StethoInterceptor實例的網路攔截器列表:okHttpClient.networkInterceptors().add(newStethoInterceptor());okHttpClient.networkInterceptors().add(newStethoInterceptor());然後,運行應用程序,打開瀏覽器後,輸入chrome://inspect。然後你就會看到應用程序的設備和標識符的列表。然後滑鼠右鍵選擇inspect打開開發者工具,然後打開新的tab,開始監控OkHttp請求。3.使用Picasso和Retrofit你可能使用過Picasso來載入網路圖片,或者使用Retrofit來簡化發出請求和解碼響應。這些第三方庫將隱式地創建自己的OkHttpClient供內部使用,如果你不明確指定一個。Picassoversion2.5.2的OkHttpDownloader類:(){OkHttpClientclient=newOkHttpClient();client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);returnclient;}(){OkHttpClientclient=newOkHttpClient();client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);returnclient;}Retrofit也有類似的工廠方法來創建自己的OkHttpClient。圖片一般在應用程序中需要載入的比較大的資源。盡管Picasso自己維護它的LRU機制來緩存圖片,在內存中嚴格執行。如果客戶端嘗試使用Picasso來載入圖片。Picasso會找不到其在內存中緩存圖像,然後將委託載入該圖片到它的內部OkHttpClient實例。並且默認情況下該實例將始終從伺服器載入圖片資源。作為defaultOkHttpClient的方法不能與上面提到的文件系統中的響應緩存配置結合起來。指定你自己的OkHttpClient實例允許返回數據從文件系統緩存響應,圖片不會從伺服器載入。這是非常重要的在程序第一次啟動以後。這個時候Picasso的內存緩存是冷的。所以它會頻繁的委託OkHttpClient實例去載入圖片。這就需要構建配置了您Picasso的OkHttpClient實例,如果你在你的代碼中使用Picasso.with(context).load()Picasso.with(context).load()載入圖片,你是用的是Picasso的單例模式。這是通過with方法懶漢模式地實例化並配置自己的OkHttpClient。因此,我們必須使我們自己的Picasso實例在單例之前通過wiht方法調用。實現這個,可以簡單的將OkHttpClient實例封裝在OkHttpDownloader中,然後傳遞給Picasso.Builder實例的downloader方法。finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);在Retrofit中要使用OkHttpClient實例,需要改造1.9.x的一個RestAdapter,需要將OkHttpClient封裝OkClient的實例中。然後把它傳遞給RestAdapter.Builder實例的setClient方法。restAdapterBuilder.setClient(newOkClient(httpClient));restAdapterBuilder.setClient(newOkClient(httpClient));在Retrofit2.0中只需要簡單的將OkHttpClient傳遞給Retrofit.Builder實例的client方法。在可汗學院的APP中我們通過Dagger依賴注入來確保我們只有一個OkHttpClient的實例。這種方法同樣也適用於Picasso和Retrofit我們提供了一個為OkHttpClient實例提供單例模式的註解示例:@Provides@(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}@Provides@(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}OkHttpClient將會通過Dagger的註解創建一個實例提供給我們的Picasso和Retrofit。4.指定一個用戶代理攔截器日誌文件和分析為我們提供了有用的信息,當客戶在每個請求提供詳細的User-Agentheader值的時候。默認情況下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。為了指定我們自己的useragent。首先創建攔截器的替換值,我們可以看stackoverflow的建議。{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}為了創建User-Agentheader值人然後傳遞給UserAgentInterceptor的構造器,使用你得到的任何信息。我們可以使用:android的系統信息可以清晰的傳遞出這是一台android設備Build.MODEL或者「製造商提供的用戶可見最終可見的名稱」Build.BRAND或者「消費者可見的品牌與產品/硬體相關信息」Build.VERSION.SDK_INT或者「消費者可見的Android提供的SDK版本號」BuildConfig.APPLICATION_IDBuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE最後三個值由的applicationID,VERSIONCODE和VERSIONNAME的值在我們的Gradlebuild腳本中了解信息可以查看versioningyourapplications和請注意,如果您的應用程序使用的是WebView,您可以配置使用相同的User-Agentheader值,你可以通過下面方法創建UserAgentInterceptor:WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);5.指定合理的超時2.5.0版本之前,OkHttp請求默認為永不超時。2.5.0版本開始如果建立連接請求超時,如果從連接讀取下一個位元組或寫入的下一個位元組到連接,花費超過10秒,就終止。這樣做需要更新到2.5.0版本我們就不需要在我們的代碼中修改bug。原因很簡單是我因為我們第一次使用的時候使用了錯誤的路徑。要覆蓋這些默認值,可以分別調用setConnectTimeout,setReadTimeout或setWriteTimeout。需要注意的是Picasso和Retrofit為OkHttpClient實例指定不同的超時值時,默認情況下,Picasso指定:連接超過15秒.讀取超過20秒寫入超過20秒而Retrofit指定:連接超過15秒.讀取超過20秒沒有寫入超時通過配置Picasso和Retrofit自己的OkHttpClient實例你可以確保所有的請求超時是一致的
㈧ android的Okhttp
okhttp,你的封裝或者請求方法寫的有問題吧,URL不對也不會閃退,有請求失敗方法,沒進方法說明請求沒成功,看看接收解析的地方是否為空或異常沒有捕獲處理,檢查一下。
xUtils,現在更新到xUtils3;okhttp,現在也更新到okhttp3了。下載最新的包吧,注意新版本的差異。
㈨ android怎麼用okhttp封裝網路框架
封裝只是為了能更加簡單,僅此而已~
功能
UI 線程切換
可選擇的Callback(任意選擇UI線程或者子線程)
參數規范化,GET與POST都一樣的傳參方式
上傳/下載進度回調
可以簡單的設置Head部分
可以每次請求時自動加上需要的參數
String/JSON/byte/File… 都能一樣簡單
用法
由於輔助代碼較多,在這里就不一一貼出來了,在這里僅僅演示如何使用。
非同步GET
Http.getAsync("http://wthrcdn.etouch.cn/weather_mini", new UiCallback<String>() {
@Override
public void onFailure(Request request, Response response, Exception e) {
log("getAsync:onFailed");
}
@Override
public void onSuccess(String response, int code) {
log("getAsync:onSuccess:" + response);
}
}, new StrParam("citykey", 101010100)
);123456789101112
由於是 get 請求,在這里參數中的 citykey 會被自動解析到 url 中。
http://wthrcdn.etouch.cn/weather_mini?citykey=1010101001
同步GET
final String url = "http://wthrcdn.etouch.cn/weather_mini?citykey=101010100";
String str = Http.getSync(String.class, url);
log("getSync1:" + str);
str = Http.getSync(url, new ThreadCallback<String>() {
@Override
public void onFailure(Request request, Response response, Exception e) {
log("getSync2:onFailed");
}
@Override
public void onSuccess(String response, int code) {
log("getSync2:onSuccess:" + response);
}
});
log("getSync2:" + str);12345678910111213141516
同步方式支持兩種情況,一種有Callback,一種是沒有。
當然就算加上了Callback也並不是非同步,此時方法會等到執行完成後才會繼續往下走。之所以這么干,是為了方便在callback中直接處理ui的事兒。
在這里有必要說明一下,返回類型需要進行指定,如果沒有Callback哪么需要你傳入返回類型class。
當然如果你傳入了callback,哪么此時class就由callback
Account account = Http.getSync(Account.class, url);
User user = Http.getSync(User.class, url);
String str = Http.getSync(String.class, url, new StrParam("citykey", 101010100));123
Callback 的情況也如上所示。
非同步與同步的區別在於方法名稱:
Http.getSync()
Http.getAsync()
Http.postSync()
Http.postAsync()
Http.uploadSync()
Http.uploadAsync()
Http.downloadSync()
Http.downloadAsync()
默認情況下,upload與download具有callProgress 回調進度功能。
POST
String value1 = "xxx";
String value2 = "xxx";
String url = "http://www..com";
Http.postAsync(url, new HttpCallback<String>() {
@Override
public void onFailure(Request request, Response response, Exception e) {
e.printStackTrace();
}
@Override
public void onSuccess(String response, int code) {
log(response);
}
},
new StrParam("value1", value1),
new StrParam("value2", value2));1234567891011121314151617
post 的請求方法與get基本如出一轍。
Upload
File file = getAssetsFile();
Http.uploadAsync("http://img.hoop8.com/upload.php", "uploadimg", file, new UiCallback<String>() {
@Override
public void onProgress(long current, long count) {
super.onProgress(current, count);
log("uploadAsync onProgress:" + current + "/" + count);
mUpload.setProgress((int) ((current * 100.00 / count)));
}
@Override
public void onFailure(Request request, Response response, Exception e) {
e.printStackTrace();
log("uploadAsync onFailed");
}
@Override
public void onSuccess(String response, int code) {
log("uploadAsync onSuccess:" + response);
}
});
上傳部分也很簡單,如果需要帶有參數哪么和Post的使用方式一樣。當然此時傳入參數就不是 StrParam 而是 IOParam.
上傳的時候你可以僅僅傳遞文件+文件對應的name;或者 傳遞 IOParam; 也可以 StrParam+IOParam的方式;當然終極一點你可以傳遞:Param 類型。
㈩ Android客戶端訪問網路時,volley與okHttp,哪一個更好
OkHttp
物理質量
使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)這2個jar包,總大小差不多400k,加上自己的封裝,差不多得410k。
功能介紹
Square 公司開源的 OkHttp 是一個專注於連接效率的 HTTP 客戶端。OkHttp 提供了對 HTTP/2 和 SPDY 的支持,並提供了連接池,GZIP 壓縮和 HTTP 響應緩存功能。
優點
支持http請求,https請求。
支持文件下載。
使用的是HttpURLConnection,不要擔心android版本的變換。(至少目前是都支持的)。
支持get,post請求。
基於Http的文件上傳。
載入圖片。
缺點
比如callback回來是在線程裡面, 不能刷新UI,需要我們手動處理。
封裝比較麻煩。
Volley
物理質量
使用Volley 需要Volley.jar(120k),加上自己的封裝最多140k。
功能簡述
Volley是Goole在2013年Google I/O大會上推出了一個新的網路通信框架,它是開源的。Volley 的特點:特別適合數據量小,通信頻繁的網路操作。
優點
非常適合進行數據量不大,但通信頻繁的網路操作。
內部分裝了非同步線程。
支持get,post網路請求。
圖片下載。
可直接在主線程調用服務端並處理返回結果。
可以取消請求,容易擴展,面向介面編程。
缺點
對大文件下載 Volley的表現非常糟糕。
只支持http請求。
在BasicNetwork中判斷了statusCode(statusCode < 200 || statusCode > 299),如果合條件直
圖片載入性能一般。
使用的是httpclient,HttpURLConnection。不過在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。
總結
在我們當前的項目 xxxSDK,xxx商城裡面,使用volley就可以了,畢竟經過了日活幾十萬的測試,至少穩定性是沒有問題的。okhttp暫時還用不上。後續如果要使用okhttp,可以再深入okhttp,給項目做重構。
不過既然轉戰Android studio,網路請求還是推薦使用Retrofit2
Retrofit 是在OkHttp上封裝的,可以參考下 Volley vs Retrofit
http://blog.csdn.net/hwz2311245/article/details/46845271