客户端会向服务器发出一条 HTTP 请求, 服务器收到请求后会返回一些数据给客户端, 然后客户端再对这些数据进行解析与处理.
1 HttpURLConnection
可以使用 HttpURLConnection(官方推荐) 来发送 HTTP 请求.
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <Button
- android:id="@+id/send_request"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="发送请求"
- />
- <!-- 带滚动条的视图 -->
- <ScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <!-- 响应数据 -->
- <TextView
- android:id="@+id/response_data"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </ScrollView>
- </LinearLayout>
活动类:
- public class MainActivity extends AppCompatActivity {
- private TextView textView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- findViewById(R.id.send_request).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- send();
- }
- });
- textView = (TextView) findViewById(R.id.response_data);
- }
- private void send() {
- // 开启线程, 发送请求
- new Thread(new Runnable() {
- @Override
- public void run() {
- HttpURLConnection connection = null;
- BufferedReader reader = null;
- try {
- URL url = new URL("http://www.163.com");
- connection = (HttpURLConnection) url.openConnection();
- // 设置请求方法
- connection.setRequestMethod("GET");
- // 设置连接超时时间 (毫秒)
- connection.setConnectTimeout(5000);
- // 设置读取超时时间 (毫秒)
- connection.setReadTimeout(5000);
- // 返回输入流
- InputStream in = connection.getInputStream();
- // 读取输入流
- reader = new BufferedReader(new InputStreamReader(in));
- StringBuilder result = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- result.append(line);
- }
- show(result.toString());
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (ProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (connection != null) {// 关闭连接
- connection.disconnect();
- }
- }
- }
- }).start();
- }
- /**
- * 展示
- *
- * @param result
- */
- private void show(final String result) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- textView.setText(result);
- }
- });
- }
- }
因为在 Android 中不允许在子线程中执行 UI 操作, 所以我们通过 runOnUiThread 方法, 切换为主线程, 然后再更新 UI 元素.
最后记得声明网络权限哦:
<uses-permission android:name="android.permission.INTERNET" />
服务器响应数据
2 OKHttp
OKHttp 是一个处理网络请求的开源项目, 目前是 Android 最火热的轻量级框架, 由移动支付 Square 公司贡献 (该公司还贡献了 Picasso). 希望替代 HttpUrlConnection 和 Apache HttpClient.
首先引入 OKHttp 库依赖:
- dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile 'com.android.support:appcompat-v7:24.2.1'
- testCompile 'junit:junit:4.12'
- // 网络通信库
- compile "com.squareup.okhttp3:okhttp:3.10.0"
- }
然后点击 Android Studio 右上角的 Sync Now, 把库真正加载进来.
修改活动类:
- /**
- * 发送请求 (使用 OKHttp)
- */
- private void sendByOKHttp() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder().url("http://www.163.com").build();
- try {
- Response response = client.newCall(request).execute();// 发送请求
- String result = response.body().string();
- Log.d(TAG, "result:"+result);
- show(result);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
可以在 build() 方法之前连缀很多其他方法来丰富这个 Request 对象.
如果是 POST 请求, 那么需要构建 RequestBody 对象, 形如:
- RequestBody requestBody = new FormBody.Builder().add("param1", "value1").add("param2", "value2").build();
- Request request = new Request.Builder().url("www.163.com").post(requestBody).build();
修改活动类:
- /**
- * 发送请求 (使用 OKHttp)
- */
- private void sendByOKHttp() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder().url("http://www.163.com").build();
- try {
- Response response = client.newCall(request).execute();// 发送请求
- String result = response.body().string();
- Log.d(TAG, "result:" + result);
- show(result);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
注意: new Thread(...) 之后需要执行 start() 才会启动线程哦.
运行:
可以看出, OKHttp 比 HttpURLConnection 更强大: 同一个网址, OKHttp 能够正确地返回响应数据哦 O(_)O 哈哈~
来源: http://www.jianshu.com/p/5eee1ef02700