万书网 > 文学作品 > Android从入门到精通 > 第159页

第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服务器上完成用户登录,然后读取服务器的处理结果,具体代码如下: