第159页
图14.5 从指定网站下载文件
图14.6 下载到SD卡上的文件
14.1.4 范例2:访问需要登录后才能访问的页面
例14.6 在Eclipse中创建Android项目,名称为14.6,使用HttpClient实现访问需要登录后才能访问的页面。(实例位置:光盘\TM\sl\14\14.6)
(1)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,然后添加一个水平布局管理器,并在该布局管理器中添加两个居中显示的按钮,分别是“访问页面”按钮和“用户登录”按钮,最后添加一个滚动视图,在该滚动视图中添加一个线性布局管理器,并在该布局管理器中添加一个TextView组件,用于显示访问结果。具体代码请参见光盘。
(2)在该MainActivity中,创建程序中所需的成员变量,具体代码如下:
private Button button1; //声明一个“访问页面”按钮对象
private Button button2; //声明一个“用户登录”按钮对象
private Handler handler; //声明一个Handler对象
private String result = ""; //声明一个代表显示内容的字符串
private TextView resultTV; //声明一个显示结果的文本框对象
public static HttpClient httpclient; //声明一个静态的全局HttpClient对象
(3)编写一个无返回值的access()方法,用于建立一个发送GET请求的HTTP连接,并从服务器获得响应信息,具体代码如下:
public void access() {
String target = "http://192.168.1.66:8081/login/index.jsp"; //要提交的目标地址
HttpGet httpRequest = new HttpGet(target); //创建HttpGet对象
HttpResponse httpResponse;
try {
httpResponse = httpclient.execute(httpRequest); //执行HttpClient请求
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
result = EntityUtils.toString(httpResponse.getEntity()); //获取返回的字符串
} else {
result = "请求失败!";
}
} catch (ClientProtocolException e) {
e.printStackTrace(); //输出异常信息
} catch (IOException e) {
e.printStackTrace();
}
}
(4)在onCreate()方法中,创建一个HttpClient对象,并获取显示结果的TextView组件和“访问页面”按钮,同时为“访问页面”按钮添加单击事件监听器,在重写的onClick()方法中,创建并开启一个新的线程,在重写的run()方法中,首先调用access()方法向服务器发送一个GET请求,并获取响应结果,然后获取一个Message对象,并调用其sendMessage()方法发送消息,具体代码如下:
httpclient = new DefaultHttpClient(); //创建HttpClient对象
resultTV = (TextView) findViewById(R.id.result); //获取显示结果的TextView组件
button1 = (Button) findViewById(R.id.button1); //获取“访问页面”按钮组件
//为按钮添加单击事件监听器
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//创建一个新线程,用于向服务器发送一个GET请求
new Thread(new Runnable() {
public void run() {
access();
Message m = handler.obtainMessage(); //获取一个Message
handler.sendMessage(m); //发送消息
}
}).start(); //开启线程
}
});
(5)创建一个Handler对象,在重写的handleMessage()方法中,当变量result不为空时,将其显示到结果文本框中,具体代码如下:
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (result != null) {
resultTV.setText(result); //显示获得的结果
}
super.handleMessage(msg);
}
};
(6)获取布局管理器中添加的“用户登录”按钮,并为其添加单击事件监听器,在重写的onClick()方法中,创建一个Intent对象,并启动一个新的带返回结果的Activity,具体代码如下:
button2 = (Button) findViewById(R.id.button2); //获取“用户登录”按钮
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
LoginActivity.class); //创建Intent对象
startActivityForResult(intent, 0x11); //启动新的Activity
}
});
(7)编写LoginActivity,用于实现用户登录。在LoginActivity中,定义程序中所需的成员变量,具体代码如下:
private String username; //保存用户名的变量
private String pwd; //保存密码的变量
private String result = ""; //保存显示结果的变量
private Handler handler; //声明一个Handler对象
(8)编写一个无返回值的login()方法,用于建立一个使用POST请求方式的HTTP连接,并将输入的用户名和密码发送到Web服务器上完成用户登录,然后读取服务器的处理结果,具体代码如下: