之前写过一个java web端的登录验证,最后返回一个json字符串。

字符串格式如下:

{"appmsg":"账号或密码错误","appcode":0,"_default_boolean_a":false}

今天就结合着Android来写一个简单的登录。

注意: 在AndroidManifest.xml里给访问网络的权限

            在写具体路径时,一定要注意不要用localhost,因为识别不了。一定要写具体的IP

步骤如下:

1、先做好页面布局

2、在activity中获取用户名、密码

3、把用户名、密码附加到请求的地址上

4、new 一个子线程,在子线程里通过HttpURLConnection 去请求数据

5、根据连接返回的状态码判断是否成功连接

6、成功连接的话,就获取response的数据,返回inputstream流

7、将流转为String类型,通过UI线程的消息循环机制,将该String类型的结果返回到UI线程中

8、在UI线程中处理子线程中返回的结果

9、将String的结果转为JSONObject对象,去获取该对象中的code结果,0为登录失败,1为登录成功。

10、弹出Toast,提示用户登录失败或成功。


一、布局页面

首先是一个页面布局,如下

<?xml version="1.0" encoding="utf-8"?>                    

2、MainActivity

package com.yuanlp.qqloginweb;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity {    private static final int LOAD_SUCCESS =1 ;    private static final int LOAD_ERROR =2 ;    private EditText mQqNum;    private EditText mQqPwd;    private CheckBox mCb_rember;    /**    *主线程中建一个handler,来获取子线程中的Message    *    */    Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case LOAD_SUCCESS:                    boolean flag=checkLogin(msg.obj.toString());                    if (flag){                        Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();                    }else {                        Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_SHORT).show();                    }                    sub.setEnabled(true);            }        }    };    private Button sub;    private String mQq;    private String mPwd;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);       mQqNum= (EditText) findViewById(R.id.et_qqNum);        mQqPwd = (EditText) findViewById(R.id.et_pwd);        mCb_rember = (CheckBox) findViewById(R.id.cb_rember);        sub = (Button) findViewById(R.id.bt_sub);    }    public void login(View view){        //Toast.makeText(this,"点击了提交",Toast.LENGTH_SHORT).show();        mQq = mQqNum.getText().toString().trim();        mPwd = mQqPwd.getText().toString().trim();        //mCb_rember.getText().toString().trim();        if (TextUtils.isEmpty(mQq)||TextUtils.isEmpty(mPwd)){            Toast.makeText(this,"QQ号码或者密码为空",Toast.LENGTH_SHORT).show();            return;        }else {            //选中了保存密码            if (mCb_rember.isChecked()){            }        }        //这里设置按钮不能点,应为一直点,就一直发送请求,会造成一直请求数据        sub.setEnabled(false);             /**              * 点击按钮事件,在主线程中开启一个子线程进行网络请求              * (因为在4.0只有不支持主线程进行网络请求,所以一般情况下,建议另开启子线程进行网络请求等耗时操作)。              */        //请求网络        new Thread(){            @Override            public void run() {                try {                    Thread.sleep(5000);                    String path="http://192.168.1.111:10010/aos/pdaLogin.jhtml?username="+ mQq +"&password="+ mPwd;                    URL url = new URL(path);                    //打开httpurlconnection                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();                    conn.setRequestMethod("GET");              //设置get方式获取数据                    conn.setConnectTimeout(5000);              //设置连接超时时间5秒                    int code = conn.getResponseCode();         // 获取response状态,200表示成功获取资源,404表示资源不存在                    if (code==200){                        InputStream is=conn.getInputStream();                        BufferedReader br=new BufferedReader(new InputStreamReader(is));                        StringBuffer sb=new StringBuffer();                        String len=null;                        while((len=br.readLine())!=null){                            sb.append(len);                        }                        String result=sb.toString();                        /**                         * 子线程发送消息到主线程,并将获取的结果带到主线程,让主线程来更新UI。                        */                        Message msg= Message.obtain();                        msg.what=LOAD_SUCCESS;                        msg.obj=result;                        handler.sendMessage(msg);                    }                } catch (Exception e) {                    e.printStackTrace();                    Message msg=Message.obtain();                    msg.what=LOAD_ERROR;                    handler.sendMessage(msg);                }            }        }.start();    }    private boolean checkLogin(String result) {        boolean flag=false;        JSONObject jsonObject=null;        try {            jsonObject=new JSONObject(result);            String code=jsonObject.get("appcode").toString();            if ("0".equals(code)){                flag=false;            }else if("1".equals(code)){                flag=true;            }        } catch (JSONException e) {            e.printStackTrace();        }        return flag;    }}


更多相关文章

  1. 浅析Android中的消息机制-解决:Only the original thread that cr
  2. Android异步消息机制之Handler
  3. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  4. Android使用Retrofit进行网络请求
  5. Android之Handler用法总结
  6. Android开发之消息处理机制(一)——Handler
  7. Android异步加载图像小结 (含线程池,缓存方法)
  8. Android(安卓)Paging组件Demo
  9. 【安卓笔记】android客户端与服务端交互的三种方式

随机推荐

  1. AndroidManifest中android:exported="fal
  2. android学习笔记(三)基础UI组件1——按钮,文
  3. Android(安卓)framework层JNI的使用浅析
  4. Android下NFC的简单使用
  5. 在屏幕上方是actionBar tab的ViewPager页
  6. Android项目---语言适配
  7. Android 系统状态栏一体化
  8. 可以在Android上发定时短信
  9. android声音调整源代码分析
  10. Android 自定义View跟随页面切换小圆点