*****
**HTTPURLConnection**
[TOC=6]
# 1. HttpURLConnection的簡介:
Sun公司提供的庫,也是Java的標準類庫中的一員,但是過于原始,沒有封裝其他功能
# 2. HttpURLConnection實現網絡數據請求:
以前我們使用到的數據都是固定的死數據,那么真正的App里面,所有數據都是靈活的,展示的時候需要在網絡上獲取最新的數據,這個時候我們就需要通過一定的操作去進行網絡數據的請求。
常見的請求方式:
* GET
* POST
請求的內容:
* 數據
* 圖片
# 3. 課堂案例
## 3.1 InputStream轉字符串的方法
方法一:
~~~
public String inputStream2String() {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String str = result.toString(StandardCharsets.UTF_8.name());
return str;
}
~~~
方法二:
~~~
public String inputStream2String() {
StringBuilder sb = new StringBuilder();
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while ((line = br.readLine()) != null) {
sb.append(line);
}
String str = sb.toString();
return str;
}
~~~
方法三 Google Guava提供:
~~~
public String inputStream2String() {
return CharStreams.toString(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
}
~~~
方法四 Google Guava提供:
~~~
public String inputStream2String() {
return new String(ByteStreams.toByteArray(inputStream));
}
~~~
## 3.2 HTTPURLConnection請求網絡文本



核心代碼:
`
~~~
package cn.zhaoliang5156.day02.ui;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import cn.zhaoliang5156.day02.R;
/**
* 網頁源碼 查看
*
* @author zhaoliang
* @version 1.0
* @date 2019-03-13
*/
public class SourceActivity extends AppCompatActivity {
// 聲明控件
private EditText etInput;
private TextView tvResult;
private String result;
// 用來更新UI的Handler
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
tvResult.setText(result);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_source);
bindView();
}
/**
* 綁定控件
*/
private void bindView() {
etInput = findViewById(R.id.et_source_input);
tvResult = findViewById(R.id.tv_result);
}
/**
* 按鈕點擊事件,點擊按鈕請求網絡數據
*
* @param view
*/
public void showSource(View view) {
new Thread() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
// 創建尋址對象
URL url = new URL(etInput.getText().toString());
// 通過URL的openConnection方法打開連接
connection = (HttpURLConnection) url.openConnection();
// 設置請求方法
connection.setRequestMethod("GET");
// 設置連接超出
connection.setConnectTimeout(5000);
// 設置讀取超時
connection.setReadTimeout(5000);
// 判斷服務器是否響應成功 響應成功狀態碼為200
if (connection.getResponseCode() == 200) {
// 獲取服務器返回的流對象
InputStream inputStream = connection.getInputStream();
// 把服務器的流對象轉換成字符串
result = inputStream2String(inputStream);
// 發送消息 更新UI
mHandler.sendEmptyMessage(0x00);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 把流轉換成字符串
*
* @param inputStream
* @return
* @throws IOException
*/
private String inputStream2String(InputStream inputStream) throws IOException {
// 創建ByteArrayOutputStream對象
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 創建一個變量用來存儲讀取的長度
int len = -1;
// 創建一個字節數組用來存儲讀取到的數據
byte[] b = new byte[1024];
// 使用循環讀取流
while ((len = inputStream.read(b)) != -1) {
// 把讀取的數據寫入到輸出流中
outputStream.write(b, 0, len);
}
// 把流轉換成字符串
return new String(outputStream.toByteArray());
}
}
~~~
`
## 3.3 HTTPURLConnection請求網絡圖片


## 3.4 HTTPURLConnection注冊登錄
## 3.5 HTTPURLConnection+Handler+ListView 綜合應用
# 4. 擴展:
String/StringBuffer/StringBuilder的區別
String:不可變字符串
StringBuffer:可變字符串,效率低,線程安全
StringBuilder:可變字符序列,效率高,線程不安全
- 咨詢項目實戰
- 第一單元 HTTP協議
- 1.1 OSI七層模型
- 1.2 HTTP協議(重點)
- 1.3 HTTPS協議(了解)
- 1.4 TCP/IP協議擴展
- 1.5 WebService簡介及實戰(無接口)
- 1.6 課后練習
- 第二單元 HTTPURLConnection
- 2.1 ANR
- 2.2 網絡判斷
- 2.3 HTTPURLConnection
- 2.4 課后練習
- 第三單元 AsyncTask
- 3.1 AsyncTask概述
- 3.2 AsyncTask基本使用
- 3.3 課后練習
- 第四單元 圖片異步加載
- 4.1 圖片異步加載概述
- 4.2 LruCache
- 4.3 DiskLRUCache
- 4.4 圖片三級緩存概述
- 4.5 封裝圖片加載緩存框架
- 第五單元 ListView多條目
- 5.1 ListView多條目概述
- 5.2 ListView多條目的使用
- 第六單元 ListView實現下拉刷新上拉加載
- 6.1 下拉刷新和上拉加載更多
- 6.2 XListView概述
- 6.3 XListView的使用
- 第七單元 封裝網絡框
- 7.1 封裝網絡框架概述
- 7.2 網絡框架的封裝
- 第八單元 項目介紹
- 8.1 公司項目團隊架構簡介
- 8.2 項目文檔及項目流程介紹
- 8.3 項目管理
- 8.4 項目開發
- 第九單元 項目框架搭建
- 9.1 基類封裝概述
- 9.2 Application中初始化配置
- 9.3 項目中的工具類
- 9.4 封裝網絡請求框架
- 9.5 封裝圖片異步緩存框架
- 第十單元 搭建UI框架1
- 10.1 側滑菜單概述
- 10.2 主界面框架搭建
- 第十一單元 搭建UI框架2
- 11.1 TabLayout的概述
- 11.2 TabLayout的使用
- 第十二單元 圖片上傳
- 12.1 圖片上傳概述
- 12.2 圖片上傳的實現
- 第十三單元 PullToRefresh
- 13.1 PullToRefresh概述
- 13.2 PullToRefresh的使用
- 13.3 緩存業務實現思路
- 第十四單元 事件分發及滑動沖突
- 14.1 事件分發概述
- 14.2 事件分發流程
- 14.3 事件分發的使用
- 第十五單元 傳感器的基本使用
- 15.1 傳感器概述
- 15.2 傳感器的使用
- 第十六單元 HTML與CSS復習
- 16.1 HTML
- 16.2 CSS
- 第十七單元 js復習
- 17.1 js基礎語法
- 17.2 js數組和內置對象
- 17.3 js常用事件
- 17.4 js對象模型
- 17.5 js 正則表達式
- 第十八單元 WebView
- 18.1 WebView 概述
- 18.2 WebView的使用
- 18.3 WebView與js交互
- 第十九單元 項目案例
- 項目概述
- 第二十單元 項目答辯
- 周考
- 第一周周考
- 第二周周考
- 第三種周考
- 月考
- 接口文檔