上次笔记:安卓开发笔记(一)中我们讲了使用android studio搭建安卓开发环境的一些操作,这些操作主要是针对android的一些单机软件进行的一些操作,实际上在日常应用中android的app需要结合互联网,通过服务器进行操作,因为在应用过程中通常涉及到数据共享,数据库操作或者许多涉及到交互的操作,这些操作常常需要结合互联网进行,并且需要在服务端和客户端同时编写相应的代码进行处理。在以前的笔记中我介绍了使用Java+Tomcat+mysql进行服务端的开发,并且开发了一个简单的服务端的demo,这个demo十分简单,主要涉及到用户登录,用户文件上传和下载等操作,在以前的笔记中我们采用的测试服务端是web端,今天我们要使用安卓端基于上次的服务端代码开发出一个简单的用户登录的判断小程序,好了废话不多说,直接进入干活。
使用android开发互联网代码可用的框架很多,由于在服务端我使用的是apache的HttpClient,使用Http协议进行数据传输,在android端也准备采用此框架进行,然而由于我使用的android SDK为23版本,andorid5.1,在此以及以后的版本中google放弃了HttpClient,至于为什么放弃,大家可以从官网了解,因此只能学习使用HttpURLConnection进行连接了,当然整个学习过程参考了以上位置的教程:http://www.runoob.com/w3cnote/android-tutorial-httpurlconnection.html不知道国内能不能上,我一直用着VPN所以比较方便,这个网址上有比较全面和详细的android教程,有兴趣的可以看看,按照这个教程的代码一步步实现了HttpURLConnection的GET方法,并实现了其所截图的所有功能,当然在这里要说明一下,这个教程所提供的代码并不是所有代码,只是部分代码,其他的部分代码需要自己添加,其中有一个地方困扰我比较长的时间,首先Menu这个在其教程中没有,我们可以简单的实现一个,首先在android studio中新建一个资源文件,资源类型为Menu,命名随意,这样在res文件夹中会出现一个menu菜单如图所示:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/one"
android:title="请求图片"/>
<item
android:id="@+id/two"
android:title="请求html"/>
<item
android:id="@+id/three"
android:title="请求html加载到网页"/>
<item
android:id="@+id/four"
android:title="登录"/>
</menu>
其他的布局代码并没有进行什么修改,然而所有代码按照以上网址编写之后会存在一个问题,无法连接到网页或者无法获取数据的问题,这个问题困扰了我很久,今天下午解决了这个问题,解决方法为:
public class PostUtils {
public static String LOGIN_URL="http://192.168.10.116:8080/Mobile1/servlet/loginServlet";
public static String LoginByPost(String number,String passwd){
String msg="";
try{
HttpURLConnection conn=(HttpURLConnection) new URL(LOGIN_URL).openConnection();
//设置请求方式,请求超时信息
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
//设置运行输入,输出:
conn.setDoOutput(true);
conn.setDoInput(true);
//Post方式不能缓存,需手动设置为false
conn.setUseCaches(false);
//我们请求的数据:
String data = "passwd="+ URLEncoder.encode(passwd, "UTF-8")+
"&number="+ URLEncoder.encode(number, "UTF-8");
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
out.flush();
if (conn.getResponseCode() == 200) {
// 获取响应的输入流对象
InputStream is = conn.getInputStream();
// 创建字节输出流对象
ByteArrayOutputStream message = new ByteArrayOutputStream();
// 定义读取的长度
int len = 0;
// 定义缓冲区
byte buffer[] = new byte[1024];
// 按照缓冲区的大小,循环读取
while ((len = is.read(buffer)) != -1) {
// 根据读取的长度写入到os对象中
message.write(buffer, 0, len);
}
// 释放资源
is.close();
message.close();
// 返回字符串
msg = new String(message.toByteArray());
return msg;
}
}catch(Exception e){e.printStackTrace();}
return msg;
}
}
以上的服务器地址是我本机作为服务器的地址,这个大家可以随意选取,最方便的是选取学校校园网的登录页面,如果知道的话。登录成功之后获取服务端发来的数据,这个数据可以是各种格式,下面是三种不同的方式:
1.直接返回0或1,然后客户端进行判断之后进行处理,并不返回数据
2.返回html数据或直接返回数据给客户端进行处理,客户端可以在其他显示界面进行显示等操作
这两种方式代码分别为:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
UserDao dao =new UserDaoImpl();
String username = request.getParameter("username");
String password = request.getParameter("password");
User u = dao.login(username, password);
if(u!=null){
request.getSession().setAttribute("user", username);
request.getSession().setAttribute("password", password);
out.print("1");
//response.sendRedirect("listFileServlet?cur=1");
}else{
out.print("0");
//response.sendRedirect("../index.jsp");
}
out.flush();
out.close();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
UserDao dao =new UserDaoImpl();
String username = request.getParameter("username");
String password = request.getParameter("password");
User u = dao.login(username, password);
if(u!=null){
request.getSession().setAttribute("user", username);
request.getSession().setAttribute("password", password);
response.sendRedirect("listFileServlet?cur=1");
}else{
out.print("0");
response.sendRedirect("../index.jsp");
}
out.flush();
out.close();
}
对与这两种方式的数据进行显示也有差异,如果是数据的话可以在客户端使用客户端控件进行显示,如果是html的话,可以直接使用web view进行显示,显示结果如下图: