使用HttpURLConnection發送請求獲取回傳資料,網路連接請求超時會發生閃退,
可能的原因有兩種
- 回傳的網路連接為空,后續通過該連接呼叫獲取回傳碼或者獲取回傳資料等方法時會發生空指標錯誤造成程式閃退,
- 用戶連續請求用戶導致等待訪問的執行緒積累很多,如果十秒等不到反應,系統會認定該APP行程是僵尸行程,直接干掉也會導致閃退,
解決方法
寫一個聯網工具封裝聯網的操作,在這個操作中捕獲超時例外,如果捕獲到了提示用戶網路超時,不要頻繁請求,
當然如果用戶硬要頻繁請求,也沒關系,關閉連接后回傳一個空值,在訪問網路子執行緒中判斷,如果為空直接回傳不再繼續執行代碼,關閉執行緒,
訪問網路工具類的方法中捕獲例外:

在訪問網路子執行緒中呼叫了網路工具類中的發送請求的方法,如果回傳的conn為空,直接回傳,關閉子執行緒,

下面給出完整的聯網工具類
package com.example.littlearrangement.Util;
import android.app.Activity;
import android.util.Log;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class HTTPUtil {
private static HttpURLConnection conn = null;
// 使用http協議發送請求并獲取回傳資料,引數是請求的引數以及請求的服務
public static HttpURLConnection sendDataByHttp(final Activity context, String data, String serve){
try{
// 1、生成URL物件
String path = "http://xxx.abc.def/"+serve;
URL url = new URL(path);
// 2、生成連接物件
conn = (HttpURLConnection)url.openConnection();
// 3、設定請求方式 get表示獲取資料;post表示提交資料
conn.setRequestMethod("POST");
// 4、設定超時資訊、允許輸入輸出
conn.setReadTimeout(4000);//設定超時資訊
conn.setConnectTimeout(4000);//設定超時資訊
conn.setDoInput(true);//設定輸入流,允許輸入
conn.setDoOutput(true);//設定輸出流,允許輸出
// 5、設定提交的引數,鍵值對形式,&隔開
System.out.println(data); // 除錯輸出
// 6、獲取輸出流
OutputStream out = conn.getOutputStream();
// 7、將提交的引數以位元組形式寫入輸出流
out.write(data.getBytes());
out.flush();//重繪,將資料緩沖區中的資料全部輸出,并清慷訓沖區輸出流并釋放與流相關的資源
out.close();//關閉
} catch (ProtocolException e) {
e.printStackTrace();
}catch ( SocketTimeoutException e){ // 捕獲網路訪問超時例外,一旦捕獲到就會回傳空值
e.printStackTrace();
Log.v("login", "網路連接失敗");
context.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "網路連接失敗", Toast.LENGTH_SHORT).show();
}
});
conn.disconnect(); // 關閉連接
return null;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
}
以及使用該工具類的一個實體
要注意,需要在子執行緒中訪問網路
// 訪問網路
new Thread(new Runnable() {
@Override
public void run() {
String data = "action=add&from=android&name="+user.getUserName()+"&content="+context+"&type="+importance;
Log.v("login", data);
HttpURLConnection conn = HTTPUtil.sendDataByHttp(AddToDoListActivity.this, data, "todolist");
if (conn == null){ // 網路連接失敗,回傳
return;
}
try{ // 訪問成功
// 8、獲取http狀態回傳代碼,200表示成功
int code = conn.getResponseCode();
// 9、成功處理,獲取輸入流
if (code == 200){
Log.v("login","成功處理");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
response.append(line);
Log.v("login", "讀到了資料:"+response.toString());
if (response.toString().equals("添加成功")){
Log.v("login","添加成功:"+code);
}else{
Log.v("login", "添加失敗");
}
}
conn.disconnect();
}else{
Log.v("login","回傳錯誤碼:"+code);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
如果你還想了解安卓端如何獲取網頁端傳過來物件的話,請點擊
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/395385.html
標籤:其他
