目录
14.网络编程及Internet应用(一)
1.通过HTTP访问网络
在Android中也可以使用HTTP协议访问网络。例如,在使用应用宝App下载游戏时,或者刷新朋友圈时,都需要通过HTTP协议访问网络。
在Android中提供了两个用于HTTP通信的API,即HttpURLConnection和Apache的HttpClient。由于Android 6.0版本已经基本将HttpClient从SDK中移除了。所以这里主要介绍HttpURLConnection。
HttpURLConnection类位于java.net 包中,用于发送HTTP请求和获取HTTP响应。由于该类是抽象类,不能直接实例化对象,则需要使用URL的openConnection()方法来获得。例如,要创建一个http://www.example.com 网站对应的HttpURLConnection对象,可以使用下面的代码:
URL url = new URL("http://www.example.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
HttpURLConnection是URLConnection的一个子类,它在URLConnection的基础上提供了如表14.1所示的方法,从而方便发送和响应HTTP请求。
表14.1 HttpURLConnection常用的方法
方法 | 描述 |
---|---|
int getResponseCode() | 获取服务器的响应代码 |
String getResponseMessage() | 获取服务器的响应消息 |
String getRequestMethod() | 获取发送请求的方法 |
void setRequestMethod(String method) | 设置发送请求的方法 |
创建了HttpURLConnection对象后,就可以使用该对象发送HTTP请求了。
1-1.发送GET请求
使用HttpURLConnection对象发送请求时,默认发送的就是GET请求。因此,发送GET请求比较简单,只需要在指定连接地址时,先将要传递的参数通过“?参数名=参数值”的形式进行传递(多个参数间使用英文半角的“&”符号分隔。例如,要传递用户名和E-mail地址这两个参数,可以使用“?user=abc&email= abc@qq.com”实现),然后获取输入流中的数据,并关闭连接即可。
注:使用HTTP协议访问网络就是客户端与服务器的通信,所以运行本章实例不仅需要创建客户端app实例,还需要创建简单的后台服务器。
(1) 永远不要在主线程上执行网络调用。
(2) 在Service而不是Activity 中执行网络操作。
例 :
MainActivity.java
package com.example.getrequest;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
public class MainActivity extends Activity {
private EditText content; //定义一个输入文本内容的编辑框对象
private Handler handler; //定义一个android.os.Handler对象
private String result = ""; //定义一个代表显示内容的字符串
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
content = (EditText) findViewById(R.id.main_et1); //获取输入文本内容的EditText组件
final TextView resultTV = (TextView) findViewById(R.id.main_tv1); //获取显示结果的TextView组件
Button button = (Button) findViewById(R.id.main_btn1); //获取“发表”按钮组件
button.setOnClickListener(new View.OnClickListener() { //单击发送按钮,实现读取服务器微博信息
@Override
public void onClick(View v) {
//判断输入内容是否为空,