當前位置:首頁 » 安卓系統 » android同步請求數據

android同步請求數據

發布時間: 2023-05-06 01:03:19

1. 【Android知識點總結系列】之OkHttp原理總結

先看一張流程圖(來自 這篇文章 ),另外推中攔慎薦博主的另賣敬一篇 Retrofit解讀 :

整個請求流程是從RealCall開始的:
1.1 如果是同步請求( execute() ):

1.2 如果是非同步請求( enqueue() ):衡槐

3.1 首先

3.2 具體的攔截器包括:

3.3 總的來說

2. Android網路請求庫【OkHttp4.9.3】基本用法與原理分析

OkHttp是一套處理 HTTP 網路請求的依賴庫,由 Square 公司設計研發並開源,目前可以在 java 和 Kotlin 中使用。對於 Android App 來說,OkHttp 現在幾乎已經占據了所有的網路請求操作,Retrofit + OkHttp實現網路請求似乎成了一種標配。因此它也是每一個 Android 開發工程師的必備技能,了解其內部實現原理可以更好地進行功能擴展、封裝以及優化。

OkHttp的高效性體現在:

第一步:創建OkHttpClient,創建OkHttpClient有兩種方式:

OkHttpClient提供了豐富的配置方法,例如添加攔截器、指定連接池、設置請求超時等等。

第二步:創建請求

使用Request.Builder() 構建Request實例

第三步:發起網路請求

OkHttp支持同步和非同步兩種請求方式

OkHttp的使用方法非常簡單,三步操作就可以發起一個簡單的同步或非同步請求。我們也可以很輕松地對網路請求進行配置,例如添加請求頭、設置請求方式、設置請求超時等等,這些配置參數會在源碼分析過程中詳細介紹。

現在我們已經學會了三步操作發起網路請求,接下來以這三個步驟為切入點,深入到源碼中學習OkHttp的實現原理,廢話少說馬上開車。

OkHttpClient創建方式有兩種,我們看看兩種方式有什麼區別。

第一種直接使用默認構造函數,內部依然是使用建造者模式

第二種使用建造者模式

兩種方式最終都是調用構造函數OkHttpClient(builder:Builder),由參數builder負責所有的參數配置工作。

當您創建單個OkHttpClient實例並將其用於所有 HTTP 調用時,OkHttp 性能最佳。 這是因為每個OkHttpClient都擁有自己的連接池和線程池,重用連接和線程可減少延遲並節省內存。 相反,為每個請求創建一個客戶端會浪費空閑池上的資源。

Request同樣使用建造者模式來創建,這里貼上部分重要源碼,很簡單就不細說了。

OkHttp發起網路請求分為同步請求和非同步請求兩種方式,我們只分析非同步請求流程,因為只要理解了非同步請求過程,基本上也就明白同步請求是怎麼一回事了。

RealCall是連接應用層與網路層的橋梁,負責處理連接、請求、響應和數據流。

Dispatcher維護著一套非同步任務執行策略,分析策略之前先介紹幾個重要概念:

client.dispatcher.enqueue(AsyncCall(responseCallback)) 執行步驟為:

AsyncCall實現了Runnable介面,因此一旦被線程池中的線程處理就會調用它的run()方法:

話休絮煩,我們開始分析攔截器責任鏈:

責任鏈執行流程:首先獲取當前攔截器interceptor,並且調用interceptor.intercept(next)執行攔截器操作。這里的next表示的是index+1後的責任鏈對象,攔截器的intercept()方法內部會調用next.proceed(request)方法再次進入到責任鏈,由於此時index已經加1,所以處理的是下一個攔截器。

如此循環往復,直到處理完責任鏈上最後一個攔截器為止。

注意除最後一個攔截器CallServerInterceptor不會調用chain.proceed(request)方法之外,其他攔截器都應該至少調用一次chain.proceed(request)方法。

為了驗證上面的結論,我們進入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:

可以看到注釋1處重新進入責任鏈處理下一個攔截器。

有興趣可以自行查看最後一個攔截器CallServerInterceptor源碼,此處只給出本人閱讀源碼後得出的結論:

以上就是攔截器責任鏈的工作流程,我們再通過流程圖仔細感受一下。

分析完攔截器責任鏈,我們繼續分析AsyncCall#run()方法:

我們看到,如果()方法成功獲得服務端返回的數據,則調用responseCallback.onResponse(this@RealCall, response)方法完成非同步回調;如果服務端數據獲取失敗(請求異常),則調用responseCallback.onFailure(this@RealCall, canceledException)方法完成非同步回調

需要注意的是,responseCallback回調是在子線程中完成的,所以如果想把數據顯示到UI上,需要切換回主線程進行UI操作。

OkHttp發起網路請求全過程:

【知識點】OkHttp 原理 8 連問

3. Android-Choreographer 垂直同步 Vsync

view.requestLayout 調用的是 parent.requestLayout,直到 DecorView 最終到 ViewRootImpl.requestLayout 方法。

提示: requestLayout() 跟 invalidate() 區別在於 PFLAG_FORCE_LAYOUT、PFLAG_INVALIDATED,invalidate 不會重新測量布局,只會重新繪制

調用棧:mChoreographer.postCallback(int callbackType, Runnable action, Object token) --> postCallbackDelayed() --> postCallbackDelayedInternal()

至此從調用 requestLayout 到請求 Vsync 信號過程已經結束。
下面看收到 Vsync 信號後,如何處理 mTraversalRunnable 任務。

doTraversal()方法則是 測量、布局、繪制 入口,此處不做分析。

Vsync 垂直同步:
    涉及到垂直刷新脈沖、vsync 、gpu 緩沖區 Frame Buffer、Back Buffer 三重緩存,跟 Choreographer
    gpu 像素柵格化
    垂直同步使得顯卡的輸出幀數和屏幕的刷新速度保持一致,其中 vsync 用來同步信息,buffer 緩存數據,當 vsync 出現時,cpu 會立即處理下一幀數據寫入到緩存中,
    之後gpu再渲染數據寫在同一個緩存中,當vsync時,下一幀的 buffer 跟當前幀所在的buffer數據交換,當如果之前幀未顯示完,是不會進行數據交換的。屏幕掃描下一次的數據顯示。
    當一個信號來時,假設a b buffer都被佔用,此時gpu使用c緩存下一幀的數據,可以有效減少掉幀的幾率。

1、view.requestLayout 調用的是 parent.requestLayout ,直到 DecorView 最終到 ViewRootImpl.requestLayout 方法。
2、首先判斷正在測量布局,沒有則 checkThread 檢驗當前是否在主線程。在 scheleTraversals 首先中執行同步屏障,其次再將任務 postCallback 給 Choreographer,Choreographer 將任務保存在 mCallbackQueues 中,同時發送 MSG_DO_SCHEDULE_CALLBACK 的同步消息給FrameHandler。FrameHandler 的優先執行 CALLBACK 同步消息調用 doScheleCallback,mCallbackQueues 不為空且 callback 不是延遲執行,調用 scheleFrameLocked 方法請求 Vsync 信號。當運行在 Looper 線程,則立刻調度 vsync,否則,發送消息到UI線程再調度 vsync。其中是通過 FrameDisplayEventReceiver 調度 vysnc。

FrameDisplayEventReceiver 有兩個作用,一個是 scheleVsync 請求調度,另一個是接收 vsync 信號回調 onVsync,當接收到 vsync 信號時,調用doFrame 方法,開始渲染下一幀。

doFrame 可以分為三步:一是計算掉幀邏輯,二是記錄幀繪制信息,三是處理多種 callback,依次是 input 調用棧,會回調到 DecorView 的 dispatchTouchEvent。
二是 animation 調用棧,執行動畫;三是 Traversal 調用棧,即最發送給 Choreographer 的任務

動畫如何流暢執行: 調用animation.start時,最終在AnimationHandler會給Choreographer.FrameCallback 回調 doFrame,裡面 post了自己。

4. android okhttp什麼時候使用同步請求

從太初到永遠一直使用同步。這種同步是完全的,是單一的,是不變的,是永存的

5. 安卓手機怎麼備份到蘋果

備份手機中數據可以通過以下方法操作:
1.若支持SD卡,可將數據備份至外置SD卡。
1)備份多媒體文件:我的文件-設備存儲-查找需要備份的照片、視頻等,以照片為例,進入DCIM文件夾-Camera-點擊右上角更多-編輯-選擇照片-選擇後再次點擊更多-復制-點擊「SD卡」-選擇需要復制的位置-點擊「粘貼到這」(或粘貼到此處)即可。
2)備份聯系人:聯系人-更多(右上角)-設置-導入/導出聯系人-導出-SD卡。
2.備份到電腦:
1)方式1:將手機/平板通過數據線與電腦連接,電腦會顯示可移動磁碟盤符,將手機中多媒體文件復制到電腦中。
2)方式2:使用S 換機助手或Kies備份手機中數據。
電腦中安裝S 換機助手或Kies軟體,將手機與電腦連接後,通過S 換機助手或Kies中的備份功能,選擇需要的內容備份即可。

6. Android Retrofit詳解

Retrofit 是一個 RESTful 的 HTTP 網路請求框架的封裝,網路請求的工作本質上是 OkHttp 完成,而 Retrofit 僅負責 網大知絡祥橘請求介面的封裝

1.添加Retrofit庫的依賴:

後面三個是可選的,分別是數據解析器和gson,以及rxjava支持的依賴

2.創建 用於描述網路請求 的介面
Retrofit將 Http請求 抽象成 Java介面:採用 註解 描述網路請求參數 和配置網路請求參數

3.創建Retrofit實例

4.發送請求
請求分為同步請求和非同步請求

response.body()就是Reception對象,網路請求的完整 Url =在創建Retrofit實例時通過滾宴消.baseUrl()設置 +網路請求介面的註解設置(下面稱 「path「 )
整合的規則如下:

上面我們用了@GET註解來發送Get請求,Retrofit還提供了很多其他的註解類型

1.@GET、@POST、@PUT、@DELETE、@HEAD分別對應 HTTP中的網路請求方式
2.@HTTP替換@GET、@POST、@PUT、@DELETE、@HEAD註解的作用 及 更多功能拓展
具體使用:通過屬性method、path、hasBody進行設置

1.@FormUrlEncoded
表示發送form-encoded的數據,每個鍵值對需要用@Filed來註解鍵名,隨後的對象需要提供值。
2.@Multipart
表示發送form-encoded的數據(適用於 有文件 上傳的場景),每個鍵值對需要用@Part來註解鍵名,隨後的對象需要提供值。

1.@Header & @Headers
添加請求頭 &添加不固定的請求頭

2.@Body
以 Post方式 傳遞 自定義數據類型 給伺服器,如果提交的是一個Map,那麼作用相當於 @Field,不過Map要經過 FormBody.Builder 類處理成為符合 Okhttp 格式的表單,如:

3.@Field & @FieldMap
發送 Post請求 時提交請求的表單欄位,與 @FormUrlEncoded 註解配合使用

4.@Part & @PartMap
發送 Post請求 時提交請求的表單欄位,與@Field的區別:功能相同,但攜帶的參數類型更加豐富,包括數據流,所以適用於 有文件上傳 的場景,與 @Multipart 註解配合使用

5.@Query和@QueryMap
用於 @GET 方法的查詢參數(Query = Url 中 『?』 後面的 key-value)
如:url = http://www.println.net/?cate=android ,其中,Query = cate
配置時只需要在介面方法中增加一個參數即可:

6.@Path
URL地址的預設值

7.@Url
直接傳入一個請求的 URL變數 用於URL設置

7. 安卓除了游戲數據不能同步蘋果

你好,這個蘋果谷歌數據不互通是定了的,蘋果理念是為了用戶體驗不允許進行任何改動,所以造成iOS封閉性很高,雖然最近iOS版本逐漸有開放趨勢不過數據互通還做不到,請耐心等待吧
ios與安卓數據不互通是因為Android和iOS用的不是同一個伺服器,而之所以用的不是同一個伺服器,是因為二者系統有很大的區別。
1、Android是用java語言開發的,所以伺服器也可以用java語言開發,利用json進行通信。
2、而iOS則是switch開發,伺服器那一部分一般是用Python,PHP等開發。
如果都塞到一個伺服器上,伺服器得區別哪些是Android發送的請求, 哪些是iOS發送的請求,對於游戲這種大型數據交流的應用非常巨大,區別之後又得發送Android能識別的結果或者iOS能識別的結果,因此他們把伺服器分開了,Android用Android的伺服器,iOS用iOS的伺服器。

8. 如何實現android客戶端與服務端數據同步

android客戶端不能直接與伺服器資料庫連接,拿sqlserver來說,安裝之後有幾個G那麼大,android程序是跑在手機上的,想讓程序直接訪問sqlserver,那手機需要非常大的內存。但是可以通過webservice這樣一個橋梁來間接訪問SQLServer。

即在伺服器運行一個服務端程序,該服務端程序通過接收來自android客戶端的指令,對資料庫進行操作。客戶端與服務端直接的數據傳輸主要通過http協議發送和接收json數據或者xml數據,服務端接收到客戶端的json數據之後,進行json解析,再按一定的邏輯對資料庫進行增、刪、改、查。客戶端的http請求可以通過 HttpClient類實現,在anddroid 4.0之後,客戶端的網路請求已經不被允許在主線程中運行,所以題主還需注意另開啟一個子線程進行網路請求。

9. 我想了解android http請求 同步與非同步的區別

給你舉一個例子,點擊按鈕執行HTTP請求然後跳轉下一頁。
同步:發送http請求→獲取返回結果→分析結果→跳轉下一頁
非同步:發送http請求→跳轉下一頁(不需要等待請求結果,對結果的處理在另一個線程中)

10. android網路請求數據是同步還是非同步

非同步請求,因為UI線程(主線程)不允許有5秒以上的耗時操作.在主線程網路請求會導致阻塞,看起來程序就像假死了一樣.所以都是非同步請求.

熱點內容
android服務是什麼 發布:2025-05-20 02:19:31 瀏覽:201
什麼手機可以升到安卓十 發布:2025-05-20 02:19:24 瀏覽:570
手機U盤安卓的系統目錄里有什麼 發布:2025-05-20 02:13:08 瀏覽:849
python多進程鎖 發布:2025-05-20 02:12:23 瀏覽:293
n皇後演算法 發布:2025-05-20 01:49:15 瀏覽:66
如何配置圖形電腦 發布:2025-05-20 01:47:51 瀏覽:392
及解壓 發布:2025-05-20 01:44:49 瀏覽:415
如何用計算器刷安卓 發布:2025-05-20 01:09:29 瀏覽:576
移動寬頻密碼重置後怎麼辦 發布:2025-05-20 01:02:04 瀏覽:808
php不是內部命令 發布:2025-05-20 00:41:09 瀏覽:97