Blogger Template by Blogcrowds.

andorid 开发笔记(二)

  上次笔记:安卓开发笔记(一)中我们讲了使用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菜单如图所示:

imageimage
到这里我们就基本完成了Menu的建立,同时在XML中建立菜单的Item,其代码如下,实际上教程建立了三个item,我建立了四个第四个为POST请求进行登录的菜单,下面是菜单栏的布局代码:

<?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>


其他的布局代码并没有进行什么修改,然而所有代码按照以上网址编写之后会存在一个问题,无法连接到网页或者无法获取数据的问题,这个问题困扰了我很久,今天下午解决了这个问题,解决方法为:
image
1.如上图所示,将Android调整为Project,并找到AndroidMainfset.xml文件,向其中添加上图红色框框所示代码
2.由于android studio的版本不一样,连接后获取的返回字段也有不同,在上述教程中进行判断如果为200就获取数据,实际上这样的判断存在问题,根据我的版本应该修改为-1,当然根据不同的版本可能有差异,各位可以自行尝试,修改完成后就可以获取如教程图示的效果了,可以获取图片,网页的html或者使用web view直接显示网页。
以上为通过http协议获取数据,以下要讲的是通过POST提交表单进行登录并获取登录结果
首先根据以上Menu的代码添加了一个item,并添加相应的代码,这个可以参考教程的源码,由于UrlHttpConnection进行链接是一个耗时过程,所以需要在子线程中实现,这个从教程的代码中可以看到,这样界面的表现我们就说到这里,这里我们还是讲讲POST表单的过程,根据我理解POST表单的过程就是一个通过url向服务器提交数据的过程,这个过程很简单,就是获取服务器的url,然后向其提交链接,在服务端servlet通过提交的表单从数据库中进行查询判断,最后返回结果被客户端获取的过程。
POST表单的客户端代码为:

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进行显示,显示结果如下图:
QQ图片20160223180449QQ图片20160223180455
上面的乱码可能是编码的问题,这个问题留待以后解决。
到目前为止整个代码分析就到这儿了,下面说说我的体会,我认为整个http协议文档传输就类似这个过程,通过表单在客户端和服务器之间传递数据,同时在客户端可以通过获取得到的数据重新进行显示,因此服务器端可以将数据打包为jason格式,通过此种格式进行数据传输,极大的减小了数据传输的量,服务端就不需要搭建界面,只需要进行简单的数据传输操作了,而在客户端可以进行比较漂亮的显示界面的设计,这样对不同的设备达到适配的目的。



0 Comments:

Post a Comment



较新的博文 较早的博文 主页