转载自http://blog.csdn.net/qq_28468727/article/details/52766633html
注意点:java
一、访问网络的工做不能在主线程(UI)中进行,若是耗时过程则会致使程序出错 ------(子线程中进行)android
二、子线程不能更新UI -------(主线程中进行)web
三、使用Handler配合子线程更新主线程时要注意内存泄露的问题,解决内存泄露的方法之一就是以弱引用的形式:数据库
//弱引用,防止内存泄露
privatestaticclassMyHandlerextendsHandler {
privatefinalWeakReference mActivity;
publicMyHandler(MainActivity activity) {
mActivity = newWeakReference(activity);
}
@Override
publicvoidhandleMessage(Message msg) {
System.out.println(msg);
if(mActivity.get() ==null) {
return;
}
mActivity.get().updateUIThread(msg);
}
}
四、在使用post向服务器发送请求时,要注意发送数据参数的格式,发送的参数是以key=value&key=value&key=value的格式进行发送的,value通常都要进行URL编码
//咱们请求的数据
String data = "password="+ URLEncoder.encode(passwd,"UTF-8")+
"&username="+URLEncoder.encode(username,"UTF-8");
五、使用模拟器进行测试时,URL中的IP地址不是127.0.0.1,而是10.0.2.2
privatestaticString LOGIN_URL ="http://10.0.2.2:8080/webtest/loginaction";
实例:在Android客户端中输入用户名和密码以后,将其提交至服务器,服务器进行判断用户名和密码是否正确,若是正确则返回success,失败则返回fail缓存
配置服务器tomcat
在搭建好tomcat服务器以后,在eclipse中建立servlet文件服务器
LoginAction.java(服务器)网络
packageLogin;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjava.util.HashMap;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.util.HashMap;
importjava.util.Map;
/**
* Servlet implementation class LoginAction
*/
@WebServlet("/LoginAction")
publicclassLoginActionextendsHttpServlet {
privatestaticfinallongserialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
publicLoginAction() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
//设置客户端的解码方式为utf-8
response.setContentType("text/html;charset=utf-8");
//
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String result = "";
String name = request.getParameter("username");
String pwd = request.getParameter("password");
//System.out.println("name="+name);
//System.out.println("password="+pwd);
if(name.equals("admin")&&pwd.equals("123")) {
result = "success";
}
else{
result = "fail";
}
out.write(result);
out.flush();
out.close();
System.out.println(result);
}
}
在eclipse中中配置web.xm文件,该文件通常在WebContent ---> WEB-INF的文件夹下app
在web.xml文件中添加以下代码:
LoginAction
Login.LoginAction
LoginAction
/loginaction
Android客户端
MainActivity.java
packagecom.example.administrator.httpconnectlogin;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
importjava.lang.ref.WeakReference;
publicclassMainActivityextendsAppCompatActivity {
privateButton button;
privateEditText edit1,edit2;
privateMyHandler myhandler =newMyHandler(this);
publicstaticfinalString TAG="MainActivity";
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InitView();
}
//弱引用,防止内存泄露
privatestaticclassMyHandlerextendsHandler {
privatefinalWeakReference mActivity;
publicMyHandler(MainActivity activity) {
mActivity = newWeakReference(activity);
}
@Override
publicvoidhandleMessage(Message msg) {
System.out.println(msg);
if(mActivity.get() ==null) {
return;
}
mActivity.get().updateUIThread(msg);
}
}
//配合子线程更新UI线程
privatevoidupdateUIThread(Message msg){
Bundle bundle = newBundle();
bundle = msg.getData();
String result = bundle.getString("result");
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
voidInitView(){
button = (Button) findViewById(R.id.btn);
edit1 = (EditText) findViewById(R.id.editText1);
edit2 = (EditText) findViewById(R.id.editText2);
// Toast.makeText(MainActivity.this, "str111", Toast.LENGTH_SHORT).show();
button.setOnClickListener(newView.OnClickListener() {
@Override
publicvoidonClick(View view) {
if(edit1.toString().isEmpty()||edit2.toString().isEmpty()) {
Toast.makeText(MainActivity.this,"学号或密码不能为空", Toast.LENGTH_SHORT).show();
}
else{
//开启访问数据库线程
newThread(newRunnable() {
@Override
publicvoidrun() {
String str = HttpLogin.LoginByPost(edit1.getText().toString(),edit2.getText().toString());
Bundle bundle = newBundle();
bundle.putString("result",str);
Message msg = newMessage();
msg.setData(bundle);
myhandler.sendMessage(msg);
}
}).start();
}
}
});
}
}
链接服务器的自定义工具类
HttpLogin.java
packagecom.example.administrator.httpconnectlogin;
importandroid.util.Log;
importjava.io.BufferedReader;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.net.URLEncoder;
importjava.util.HashMap;
importjava.util.Map;
/**
* Created by Administrator on 2016/10/5.
*/
publicclassHttpLogin {
privatestaticString LOGIN_URL ="http://10.0.2.2:8080/webtest/loginaction";
publicstaticString LoginByPost(String username,String passwd){
Log.d(MainActivity.TAG,"启动登陆线程");
String msg = "";
try{
//初始化URL
URL url = newURL(LOGIN_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
Log.d(MainActivity.TAG,"11111");
//设置请求方式
conn.setRequestMethod("POST");
//设置超时信息
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
//设置容许输入
conn.setDoInput(true);
//设置容许输出
conn.setDoOutput(true);
//post方式不能设置缓存,需手动设置为false
conn.setUseCaches(false);
//咱们请求的数据
String data = "password="+ URLEncoder.encode(passwd,"UTF-8")+
"&username="+URLEncoder.encode(username,"UTF-8");
//獲取輸出流
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
out.flush();
out.close();
conn.connect();
if(conn.getResponseCode() ==200) {
// 获取响应的输入流对象
InputStream is = conn.getInputStream();
// 建立字节输出流对象
ByteArrayOutputStream message = newByteArrayOutputStream();
// 定义读取的长度
intlen =0;
// 定义缓冲区
bytebuffer[] =newbyte[1024];
// 按照缓冲区的大小,循环读取
while((len = is.read(buffer)) != -1) {
// 根据读取的长度写入到os对象中
message.write(buffer, 0, len);
}
// 释放资源
is.close();
message.close();
// 返回字符串
msg = newString(message.toByteArray());
returnmsg;
}
} catch(MalformedURLException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
Log.d(MainActivity.TAG,"exit");
returnmsg;
}
}
在AndroidManifest文件中添加访问网络权限