用DefaultHttpClient访问要登录的网络
有时候,有一些网站不光是浏览,还需要登录才能访问某些版块,这里就涉及了session\cookie等问题. Android中提供了一个DefaultHttpClient类来解决登录和访问的接口问题
DefaultHttpClient访问这类性质的网络数据步骤如下:
第一步 调用DefaultHttpClient类
第二步 新建一个子线程来写登录代码(发送登录信息),新建一个子线程来写打开页面代码(接收要访问的数据)
第三步 在AndroidManifest.xml文件中添加访问网络权限
用HttpURLConnection发送数据给网络并获得响应数据(登录)的流程:
第一步:新建一个子线程来写通信代码
第二步:用HttpPost类处理访问地址
第三步:设置请求参数并发送数据
可调用HttpPost类里的setEntity()方法设置,如:
ArrayList list=new ArrayList();
list.add(new BasicNameValuePair(参数名, 参数值);
url.setEntity(new UrlEncodedFormEntity(list,HTTP.UTF_8));
强调内容第四步:调用DefaultHttpClient类里的execute()方法建立网络连接并获得返回数据,如:
HttpResponse shuju1=DHC.execute(url);
第五步: 调用返回数据里的getEntity()方法获得核心数据,比如:
HttpEntity shuju2=shuju1.getEntity();
第六步: 用输入流读取网络数据
调用核心数据里的getContent()方法获得网络数据流
第七步: 用Handler处理获得的数据
用DefaultHttpClient接收网络数据(实现访问)的流程:
第一步: 新建一个子线程来写通信代码
第二步: 用HttpGet类或HttpPost类处理访问地址
第三步: 调用DefaultHttpClient类里的execute()方法建立网络连接并获得返回数据,如:
HttpResponse shuju1=DHC.execute(url);
第四步: 调用返回数据里的getEntity()方法获得核心数据,比如:
HttpEntity shuju2=shuju1.getEntity();
第五步: 用输入流读取网络数据
调用核心数据里的getContent()方法获得网络数据流
第六步: 用Handler处理获得的数据
代码(访问的网址为自己搭建的服务器网站,请自行使用自己的网址测试):
主页面XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.adminis.wedapp.DefiaultHttpClientLoginActivity"
android:orientation="vertical"
android:background="#FFF565">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="主页面"
android:textSize="25dp"
android:layout_marginLeft="30dp"
android:layout_marginTop="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="mainPage_OnClick"/>
<Button
android:textSize="25dp"
android:text="登 录"
android:layout_marginLeft="120dp"
android:layout_marginTop="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="login_OnClick"/>
</LinearLayout>
<TextView
android:id="@+id/show_Tv"
android:text="Please Login......"
android:layout_width="337dp"
android:layout_height="381dp"
android:layout_gravity="center"
android:background="#ffffff"/>
</LinearLayout>
ItemXMl:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="35dp"/>
<EditText
android:id="@+id/loginUse_Ed"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginTop="60dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密 码:"
android:textSize="35dp"/>
<EditText
android:id="@+id/loginPass_Ed"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
Java:
package com.example.adminis.wedapp;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class DefiaultHttpClientLoginActivity extends Activity {
private EditText name;
private EditText pass;
private DefaultHttpClient DHC; //必须定义在类中,这样才能共同拥有一个接口来访问网络
private StringBuilder s;
private TextView showText;
//用Handler处理获得的数据
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
showText.setText(s);
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_defiault_http_client_login);
showText = (TextView) findViewById(R.id.show_Tv);
//注意,必须定义在类中,这样才能共同拥有一个接口来访问网络,如果只是单独发送而不和其他东西连用,可以定义在方法里面
//在javaweb里有一个session机制,在按了登录之后,会给session发送一个用户信息(这里是帐号和密码)
//然后在登录主页面的时候,就会直接使用发送过来的session里面保存的用户信息登录去匹配条件,符合的话,就可以登录访问网络
//这样就可以实现在App直接登录和访问网页
DHC = new DefaultHttpClient();
}
//访问到主页面按钮
public void mainPage_OnClick(View view){
new Thread(new Runnable() { //创建一个线程来接收
@Override
public void run() {
BufferedReader in = null;
HttpGet url = new HttpGet("http://192.168.0.102:8080/follow2/zhu.jsp");
try {
HttpResponse data = DHC.execute(url);
HttpEntity data2 = data.getEntity();
in = new BufferedReader(new InputStreamReader(data2.getContent()));
s = new StringBuilder();
String line = "";
while ((line = in.readLine())!=null){
s.append("\n"+line);
}
handler.sendEmptyMessage(0x123);
} catch (IOException e) {
e.printStackTrace();
}finally {
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
}
//登录按钮
public void login_OnClick(View view){
//实例化一个弹出框
AlertDialog.Builder b = new AlertDialog.Builder(this);
//得到自定义的布局,并设置为弹出框的布局
final RelativeLayout RL = (RelativeLayout) getLayoutInflater().inflate(R.layout.login_item,null);
b.setView(RL);
//给弹出框添加一个确定按钮,并实现发送数据并获得网络反馈
b.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//注意这里获取的控件不在是当前的Activity,而是弹出框的Activity,所以要加上RL
name = (EditText) RL.findViewById(R.id.loginUse_Ed);
pass = (EditText) RL.findViewById(R.id.loginPass_Ed);
//启动发送线程Send(自定义)
new Thread(new Send()).start();
}
});
//事件为空就是直接关闭
b.setPositiveButton("取消",null);
//创建并显示
b.create().show();
}
//Send使用线程发送数据(使用线程来发送)
private class Send implements Runnable{
@Override
public void run() {
BufferedReader in = null;
//使用HttpPost类处理访问地址
HttpPost url = new HttpPost("http://192.168.0.102:8080/follow1/denglu.jsp");
//得到用户输入的用户名和密码,并封装好,不同于HttpURLConnection使用的是流来保存信息,这里HttpPost使用的是Arraylist并且是NameValuePair类型
ArrayList<NameValuePair> value = new ArrayList<NameValuePair>();
value.add(new BasicNameValuePair("name",name.getText().toString()));
value.add(new BasicNameValuePair("pass",pass.getText().toString()));
try {
//设置好要发送的数据
url.setEntity(new UrlEncodedFormEntity(value, HTTP.UTF_8));
//建立连接,这里才是真正的发送
HttpResponse data = DHC.execute(url);
//获得核心数据
HttpEntity data2 = data.getEntity();
//获得输入流
in = new BufferedReader(new InputStreamReader(data2.getContent()));
//创建一个暂时保存数据的字符容器,把数据一行行读出来并写到容器中
s = new StringBuilder();
String line="";
while ((line = in.readLine())!=null){
s.append("\n"+line);
}
handler.sendEmptyMessage(0x123); //发送handler请求动作,执行hadler里面的方法
} catch (IOException e) {
e.printStackTrace();
}finally { //释放资源
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}