多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
***** **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请求网络文本 ![](https://box.kancloud.cn/171edf087594e552c31353254b8b0c1c_1080x1920.png) ![](https://box.kancloud.cn/e3a81b393ffbb7e7973ff4a059d5451a_1080x1920.png) ![](https://box.kancloud.cn/fc843caf2dbcc0b6e86a50dd57717cbb_1080x1920.png) 核心代码: ` ~~~ 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请求网络图片 ![](https://box.kancloud.cn/cc3c8a8354994b05797de4fe11df4122_1080x1920.png) ![](https://box.kancloud.cn/e3f314fc97fcdabe46f9181a9e7bf5ad_1080x1920.png) ## 3.4 HTTPURLConnection注册登录 ## 3.5 HTTPURLConnection+Handler+ListView 综合应用 # 4. 扩展: String/StringBuffer/StringBuilder的区别 String:不可变字符串 StringBuffer:可变字符串,效率低,线程安全 StringBuilder:可变字符序列,效率高,线程不安全