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

android數據請求

發布時間: 2023-11-09 03:47:30

『壹』 android 開發 用模擬器可以請求到數據但是用手機就請求不到數據 試了多個手機 都不能 謝謝

如果手機無法進行數據流量上網,建議進行以下步驟操作:
1、檢查SIM卡是否開通GPRS上網業務或被臨時關閉。
使用手機數據上網功能,電話卡需開通數據流量上網業務。可以聯系電話卡當地的網路供應商,開通數據流量上網業務。
2、檢查「移動數據」開關是否開啟。
用手指向下滑動屏幕頂簾,把「移動數據」點為綠色。
若以上操作後仍無法上網,建議重置手機上網參數:設置-移動網路-接入點名稱-更多-重置為默認設置。
3、請更換其他電話卡嘗試
4、也可以換個時間段或網路環境再嘗試。
5、備份手機數據(電話簿、簡訊、圖片等),將手機恢復出廠設置
若故障依舊,建議將手機送至就近的服務中心進行檢測維修

『貳』 android怎麼在網路請求頭里加參數

android中網路通信分為socket編程和http編程,這里只介紹htt方面。網路請求方式可分為get請求,post兩種請求方式,GET方式在進行數據請求時,會把數據附加到URL後面傳遞給伺服器,比如常見的:http://XXX.XXX.XXX/XX.aspx?id=1,POST方式則是將請求的數據放到HTTP請求頭中,作為請求頭的一部分傳入伺服器。
所以,在進行HTTP編程前,首先要明確究竟使用的哪種方式進行數據請求的。

android中Http編程有兩種:1、HttpURLConnection;2、HttpClient

首先介紹一下HttpURLConnection方式的get請求和post請求方法:

[java] view
plainprint?

private Map<String, String> paramsValue;

String urlPath=null;// 發送地http://192.168.100.91:8080/myweb/login?username=abc&password=123

public void initData(){urlPath="http://192.168.100.91:8080/myweb/login";

paramsValue=new HashMap<String, String>();

paramsValue.put("username", "111");

paramsValue.put("password", "222");

}


private Map<String, String> paramsValue;
String urlPath=null;

// 發送地http://192.168.100.91:8080/myweb/login?username=abc&password=123
public void initData(){

urlPath="http://192.168.100.91:8080/myweb/login";
paramsValue=new HashMap<String, String>();
paramsValue.put("username", "111");
paramsValue.put("password", "222");
}

get方式發起請求:

[java] view
plainprint?

private boolean sendGETRequest(String path, Map<String, String> params) throws Exception {

boolean success=false;// StringBuilder是用來組拼請求地址和參數

StringBuilder sb = new StringBuilder();

sb.append(path).append("?");

if (params != null && params.size() != 0) {

for (Map.Entry<String, String> entry : params.entrySet()) {

// 如果請求參數中有中文,需要進行URLEncoder編碼 gbk/utf8

sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));

sb.append("&");

}

sb.deleteCharAt(sb.length() - 1);

}URL url = new URL(sb.toString());

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(20000);

conn.setRequestMethod("GET");if (conn.getResponseCode() == 200) {

success= true;

}

if(conn!=null)

conn.disconnect();

return success;

}
private boolean sendGETRequest(String path, Map<String, String> params) throws Exception {
boolean success=false;

// StringBuilder是用來組拼請求地址和參數
StringBuilder sb = new StringBuilder();
sb.append(path).append("?");
if (params != null && params.size() != 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
// 如果請求參數中有中文,需要進行URLEncoder編碼 gbk/utf8
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
sb.append("&");
}
sb.deleteCharAt(sb.length() - 1);
}

URL url = new URL(sb.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(20000);
conn.setRequestMethod("GET");

if (conn.getResponseCode() == 200) {
success= true;
}
if(conn!=null)
conn.disconnect();
return success;
}

postt方式發起請求:

[java] view
plainprint?

private boolean sendPOSTRequest(String path,Map<String, String> params) throws Exception{

boolean success=false;

//StringBuilder是用來組拼請求參數

StringBuilder sb = new StringBuilder();if(params!=null &¶ms.size()!=0){for (Map.Entry<String, String> entry : params.entrySet()) {sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));

sb.append("&");}

sb.deleteCharAt(sb.length()-1);

}//entity為請求體部分內容

//如果有中文則以UTF-8編碼為username=%E4%B8%AD%E5%9B%BD&password=123

byte[] entity = sb.toString().getBytes();URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(2000);

// 設置以POST方式

conn.setRequestMethod("POST");

// Post 請求不能使用緩存

// urlConn.setUseCaches(false);

//要向外輸出數據,要設置這個

conn.setDoOutput(true);

// 配置本次連接的Content-type,配置為application/x-www-form-urlencoded

//設置content-type獲得輸出流,便於想伺服器發送信息。

//POST請求這個一定要設置

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length", entity.length+"");

// 要注意的是connection.getOutputStream會隱含的進行connect。

OutputStream out = conn.getOutputStream();

//寫入參數值

out.write(entity);

//刷新、關閉

out.flush();

out.close();if (conn.getResponseCode() == 200) {

success= true;

}

if(conn!=null)

conn.disconnect();

return success;}
private boolean sendPOSTRequest(String path,Map<String, String> params) throws Exception{
boolean success=false;
//StringBuilder是用來組拼請求參數
StringBuilder sb = new StringBuilder();

if(params!=null &¶ms.size()!=0){

for (Map.Entry<String, String> entry : params.entrySet()) {

sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
sb.append("&");

}
sb.deleteCharAt(sb.length()-1);
}

//entity為請求體部分內容
//如果有中文則以UTF-8編碼為username=%E4%B8%AD%E5%9B%BD&password=123
byte[] entity = sb.toString().getBytes();

URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(2000);
// 設置以POST方式
conn.setRequestMethod("POST");
// Post 請求不能使用緩存
// urlConn.setUseCaches(false);
//要向外輸出數據,要設置這個
conn.setDoOutput(true);
// 配置本次連接的Content-type,配置為application/x-www-form-urlencoded
//設置content-type獲得輸出流,便於想伺服器發送信息。
//POST請求這個一定要設置
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", entity.length+"");
// 要注意的是connection.getOutputStream會隱含的進行connect。
OutputStream out = conn.getOutputStream();
//寫入參數值
out.write(entity);
//刷新、關閉
out.flush();
out.close();

if (conn.getResponseCode() == 200) {
success= true;
}
if(conn!=null)
conn.disconnect();
return success;

}

在介紹一下HttpClient方式,相比HttpURLConnection,HttpClient封裝的得更簡單易用一些,看一下實例:

get方式發起請求:

[java] view
plainprint?

public String getRequest(String UrlPath,Map<String, String> params){

String content=null;

StringBuilder buf = new StringBuilder();

if(params!=null &¶ms.size()!=0){for (Map.Entry<String, String> entry : params.entrySet()) {buf.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));

buf.append("&");}

buf.deleteCharAt(buf.length()-1);

}

content= buf.toString();HttpClient httpClient = new DefaultHttpClient();

HttpGet getMethod = new HttpGet(content);HttpResponse response = null;

try {

response = httpClient.execute(getMethod);

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}catch (Exception e) {

e.printStackTrace();

}if (response!=null&&response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

try {

content = EntityUtils.toString(response.getEntity());

} catch (ParseException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}return content;

}
public String getRequest(String UrlPath,Map<String, String> params){
String content=null;
StringBuilder buf = new StringBuilder();
if(params!=null &¶ms.size()!=0){

for (Map.Entry<String, String> entry : params.entrySet()) {

buf.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
buf.append("&");

}
buf.deleteCharAt(buf.length()-1);
}
content= buf.toString();

HttpClient httpClient = new DefaultHttpClient();
HttpGet getMethod = new HttpGet(content);

HttpResponse response = null;
try {
response = httpClient.execute(getMethod);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}

if (response!=null&&response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
content = EntityUtils.toString(response.getEntity());
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

return content;
}

postt方式發起請求:

[java] view
plainprint?

private boolean sendPOSTRequestHttpClient(String path,Map<String, String> params) throws Exception {

boolean success = false;

// 封裝請求參數

List<NameValuePair> pair = new ArrayList<NameValuePair>();

if (params != null && !params.isEmpty()) {

for (Map.Entry<String, String> entry : params.entrySet()) {

pair.add(new BasicNameValuePair(entry.getKey(), entry

.getValue()));

}

}

// 把請求參數變成請求體部分

UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");

// 使用HttpPost對象設置發送的URL路徑

HttpPost post = new HttpPost(path);

// 發送請求體

post.setEntity(uee);

// 創建一個瀏覽器對象,以把POST對象向伺服器發送,並返回響應消息

DefaultHttpClient dhc = new DefaultHttpClient();

HttpResponse response = dhc.execute(post);

if (response.getStatusLine().getStatusCode() == 200) {

success = true;

}

return success;

}
private boolean sendPOSTRequestHttpClient(String path,Map<String, String> params) throws Exception {
boolean success = false;
// 封裝請求參數
List<NameValuePair> pair = new ArrayList<NameValuePair>();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(), entry
.getValue()));
}
}
// 把請求參數變成請求體部分
UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");
// 使用HttpPost對象設置發送的URL路徑
HttpPost post = new HttpPost(path);
// 發送請求體
post.setEntity(uee);
// 創建一個瀏覽器對象,以把POST對象向伺服器發送,並返回響應消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
success = true;
}
return success;
}

『叄』 Android網路介面請求數據,oppo R15手機4G流量,請求不到數據。

網路介面請求數據,測試中用OPPO R15手機4G流量,請求數據時,請求提示連接超時,但用Wifi請求數據可以正常請求到數據,建議進入OPPO R15手機【設置】——【雙卡與移動網路】——【使用WLAN與移動網路的應用】,點擊軟體允許使用移動網路數據。

經過以上嘗試問題依然存在,可備份手機中的重要數據文件後,進入【設置】——【其他設置】——點擊【還原手機】,或攜帶手機前往OPPO 客戶服務中心免費檢測刷機。通過以下方式可以快速查詢到OPPO客戶服務中心的地址和電話:

1.進入OPPO官網--服務--服務網點查詢;2.進入【OPPO+】——【首頁】——【推薦】——【服務網點】。

『肆』 android中post請求怎麼傳輸內容

一、需要用到的場景

在jQuery中使用$.post()就可以方便的發起一個post請求,在android程序中有時也要從伺服器獲取一些數據,就也必須得使用post請求了。

二、需要用到的主要類

在android中使用post請求主要要用到的類是HttpPost、HttpResponse、EntityUtils

三、主要思路

1、創建HttpPost實例,設置需要請求伺服器的url。

2、為創建的HttpPost實例設置參數,參數設置時使用鍵值對的方式用到NameValuePair類。

3、發起post請求獲取返回實例HttpResponse

4、使用EntityUtils對返回值的實體進行處理(可以取得返回的字元串,也可以取得返回的byte數組)

代碼也比較簡單,注釋也加上了,就直接貼出來了

[java]
package com.justsy.url;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;

public class HttpURLActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("start url...");
String url = "http://192.168.2.112:8080/JustsyApp/Applet";
// 第一步,創建HttpPost對象
HttpPost httpPost = new HttpPost(url);

// 設置HTTP POST請求參數必須用NameValuePair對象
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("action", "downloadAndroidApp"));
params.add(new BasicNameValuePair("packageId", "89dcb664-50a7-4bf2-aeed-49c08af6a58a"));
params.add(new BasicNameValuePair("uuid", "test_ok1"));

HttpResponse httpResponse = null;
try {
// 設置httpPost請求參數
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
httpResponse = new DefaultHttpClient().execute(httpPost);
//System.out.println(httpResponse.getStatusLine().getStatusCode());
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 第三步,使用getEntity方法活得返回結果
String result = EntityUtils.toString(httpResponse.getEntity());
System.out.println("result:" + result);
T.displayToast(HttpURLActivity.this, "result:" + result);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end url...");
setContentView(R.layout.main);
}
}

ADD:使用HttpURLConnection 進行post請求

[java]
String path = "http://192.168.2.115:8080/android-web-server/httpConnectServlet.do?PackageID=89dcb664-50a7-4bf2-aeed-49c08af6a58a";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000);
System.out.println(conn.getResponseCode());

============================================================================================================================

通過get和post方式向伺服器發送請求

首先說一下get和post的區別

get請求方式是將提交的參數拼接在url地址後面,例如http://www..com/index.jsp?num=23&jjj=888;
但是這種形式對於那種比較隱私的參數是不適合的,而且參數的大小也是有限制的,一般是1K左右吧,對於上傳文件
就不是很適合。

post請求方式是將參數放在消息體內將其發送到伺服器,所以對大小沒有限制,對於隱私的內容也比較合適。
如下Post請求

POST /LoginCheck HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://192.168.2.1/login.asp
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 192.168.2.1
Content-Length: 39
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: language=en

Username=admin&checkEn=0&Password=admin //參數位置

在android中用get方式向伺服器提交請求:

在android模擬器中訪問本機中的tomcat伺服器時,注意:不能寫localhost,因為模擬器是一個單獨的手機系統,所以要寫真是的IP地址。
否則無法訪問到伺服器。

//要訪問的伺服器地址,下面的代碼是要向伺服器提交用戶名和密碼,提交時中文先要經過URLEncoder編碼,因為模擬器默認的編碼格式是utf-8
//而tomcat內部默認的編碼格式是ISO8859-1,所以先將參數進行編碼,再向伺服器提交。
private String address = "http://192.168.2.101:80/server/loginServlet";

public boolean get(String username, String password) throws Exception {
username = URLEncoder.encode(username);// 中文數據需要經過URL編碼
password = URLEncoder.encode(password);
String params = "username=" + username + "&password=" + password;
//將參數拼接在URl地址後面
URL url = new URL(address + "?" + params);
//通過url地址打開連接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//設置超時時間
conn.setConnectTimeout(3000);
//設置請求方式
conn.setRequestMethod("GET");
//如果返回的狀態碼是200,則一切Ok,連接成功。
return conn.getResponseCode() == 200;
}

在android中通過post方式提交數據。

public boolean post(String username, String password) throws Exception {
username = URLEncoder.encode(username);// 中文數據需要經過URL編碼
password = URLEncoder.encode(password);
String params = "username=" + username + "&password=" + password;
byte[] data = params.getBytes();

URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
//這是請求方式為POST
conn.setRequestMethod("POST");
//設置post請求必要的請求頭
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 請求頭, 必須設置
conn.setRequestProperty("Content-Length", data.length + "");// 注意是位元組長度, 不是字元長度

conn.setDoOutput(true);// 准備寫出
conn.getOutputStream().write(data);// 寫出數據

return conn.getResponseCode() == 200;
}

『伍』 android 怎麼發送post請求並接收二進制數據

可使用android自帶的httpclient框架實現向伺服器發起get或post請求,以下為完整的示例代碼:
1. GET 方式傳遞參數
//先將參數放入List,再對參數進行URL編碼
List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "數據")); //增加參數1
params.add(new BasicNameValuePair("param2", "value2"));//增加參數2
String param = URLEncodedUtils.format(params, "UTF-8");//對參數編碼
String baseUrl = "伺服器介面完整URL";
HttpGet getMethod = new HttpGet(baseUrl + "?" + param);//將URL與參數拼接
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse response = httpClient.execute(getMethod); //發起GET請求
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //獲取響應碼
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//獲取伺服器響應內容
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

2. POST方式 方式傳遞參數
//和GET方式一樣,先將參數放入List
params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "Post方法"));//增加參數1
params.add(new BasicNameValuePair("param2", "第二個參數"));//增加參數2
try {
HttpPost postMethod = new HttpPost(baseUrl);//創建一個post請求
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //將參數填入POST Entity中
HttpResponse response = httpClient.execute(postMethod); //執行POST方法
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //獲取響應碼
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //獲取響應內容
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

『陸』 android post請求和get請求的區別

Get請求與Post請求的區別
Get是向伺服器發索取數據的一種請求,而Post是向伺服器提交數據的一種請求
Get是獲取信息,而不是修改信息,類似資料庫查詢功能一樣,數據不會被修改
Get請求的參數會跟在url後進行傳遞,請求的數據會附在URL之後,以?分割URL和傳輸數據,參數之間以&相連,%XX中的XX為該符號以16進製表示的ASCII,如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字元串用BASE64加密
Get傳輸的數據有大小限制,因為GET是通過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關系了,不同的瀏覽器對URL的長度的限制是不同的。
GET請求的數據會被瀏覽器緩存起來,用戶名和密碼將明文出現在URL上,其他人可以查到歷史瀏覽記錄,數據不太安全。在伺服器端,用Request.QueryString來獲取Get方式提交來的數據
Post請求則作為http消息的實際內容發送給web伺服器,數據放置在HTML Header內提交,Post沒有限制提交的數據。Post比Get安全,當數據是中文或者不敏感的數據,則用get,因為使用get,參數會顯示在地址,對於敏感數據和不是中文字元的數據,則用post
POST表示可能修改變伺服器上的資源的請求,在伺服器端,用Post方式提交的數據只能用Request.Form來獲取

『柒』 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 連問

『捌』 Android 網路請求列表返回邏輯處理

我們在網路請求時,總有分頁載入等,處理業務邏輯也是比較混亂的,容易出現各種Bug,下面我這種模式用了很久,記錄一下,有任何問題,歡迎指正。

採用 SmartRefreshLayout框架,下拉刷新採用autoRefresh(),上拉載入更多是根據addOnScrollListener()自定義寫的。
注意:什麼時候載入更多,完全可以自定義。 (本文是滑動到數據一半,開始載入更多。)
1、開始請求數據

2、載入更多請求

3、數據請求完成處理:

4、布局的顯示和隱藏:

採用 SmartRefreshLayout框架,下拉刷新採用autoRefresh(),上拉載入更多採用setEnableAutoLoadMore()。
注意:setEnableAutoLoadMore()只有滑到底部才會載入第二頁。

熱點內容
mud源碼下載 發布:2025-01-23 21:19:46 瀏覽:134
反恐精英15游戲伺服器ip 發布:2025-01-23 21:13:38 瀏覽:850
起床的戰爭玩什麼伺服器 發布:2025-01-23 21:03:06 瀏覽:141
企業級安卓手機防毒軟體哪個好 發布:2025-01-23 20:59:28 瀏覽:243
資料庫精美 發布:2025-01-23 20:37:05 瀏覽:235
mysql怎麼編譯驅動 發布:2025-01-23 20:35:15 瀏覽:467
修改資料庫的語句是 發布:2025-01-23 20:26:17 瀏覽:762
linuxping域名 發布:2025-01-23 20:24:34 瀏覽:479
神經網路演算法應用 發布:2025-01-23 20:18:36 瀏覽:219
冒險島按鍵精靈腳本下載 發布:2025-01-23 19:46:50 瀏覽:751