首先我想强调一点。这个登陆的模块最好是放在另外一个线程里面来实现。否则有可能会爆出一系列的问题,

然后再与主UI 交互。这样就不会爆ANR异常

1.对于登陆模块的。首先大体的逻辑肯定是要清晰的。

                    //在这个登陆另起的线程中
                    //第一步首先要推断 是否有网络存在
                    //第二步分别对 是否有网络做对应的处理
                    //第三步分别对 有网络做对应的处理
                    //第四步分别对 没有网络做对应的处理

2.确定登陆逻辑之后接下来是怎样实现功能的问题,以下我给出最基本的核心代码

a.推断 是否有网络存在

    /**
     * 推断当前环境下网络是否可用
     *
     * @param context
     * @return true 可用  false 不可用
     */
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager mConnectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        TelephonyManager mTelephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        // 检查网络连接。假设无网络可用。就不须要进行连网操作等
        NetworkInfo info = mConnectivity.getActiveNetworkInfo();
        if (info == null || !mConnectivity.getBackgroundDataSetting()) {
            return false;
        }
        // 推断网络连接类型,仅仅有在3G或wifi里进行一些数据更新。
        int netType = info.getType();
        int netSubtype = info.getSubtype();
        if (netType == ConnectivityManager.TYPE_WIFI) {
            return info.isConnected();
        } else if (netType == ConnectivityManager.TYPE_MOBILE
                && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS
                && !mTelephony.isNetworkRoaming()) {
            return info.isConnected();
        } else {
            return false;
        }
    }

b.假设是网络可用的话,则继续下一步;假设没有网络的话,就Toast提醒用户开启网络

    /**
     * 依据username和password登陆
     *
     * @param uname
     * @param pwd
     */
    private void login(String uname, String pwd) {
        try {
            HttpParams httpParams = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
            HttpConnectionParams.setSoTimeout(httpParams, 10000);
            
            HttpClient httpclient = new DefaultHttpClient(httpParams);
            String uri = "http://xxx.xxx.xxx.xxxx:8080/api/v1/auth/login";
            HttpPost httppost = new HttpPost(uri);
            //加入http头信息
            httppost.addHeader("Content-Type", "application/json");
            //http post的json数据格式: {"id":"TOD4727","passwd":"8111668ebce8f8d27fc2f98391cf20c1"}
            JSONObject obj = null;
            HttpResponse response = null;
            obj = new JSONObject();
            obj.put("id", uname);
            obj.put("passwd", MD5.GetMD5Code(pwd));
//            System.out.println("-----post the data is  ++++ " + obj.toString());
            httppost.setEntity(new StringEntity(obj.toString()));    
            response = httpclient.execute(httppost);
            int code = response.getStatusLine().getStatusCode();
            
            if (200 == code) { //訪问正常
                String rev = EntityUtils.toString(response.getEntity());//返回json格式:{"code":"1000","message":"ok","description":""}
                System.out.println("-----get the data is  ++++  " + rev);
                obj = new JSONObject(rev);
                String resCode = obj.getString("code");
                
                if("1000".equals(resCode)){//username和password正确
                    rememberUsernameAndPassword();
                    Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(mainIntent);
                    finish();
                }else if("1002".equals(resCode)){//username不存在
                    Message msg = handler.obtainMessage();
                    msg.what = USER_NOT_EXIST;
                    handler.sendMessage(msg);
                }else if("1003".equals(resCode)){//password错误
                    Message msg = handler.obtainMessage();
                    msg.what = ERROR_PASSWORD;
                    handler.sendMessage(msg);
                }
                
            }else{//訪问出现异常
                Message msg = handler.obtainMessage();
                msg.what = NET_PROBLEM;
                handler.sendMessage(msg);
            }
        } catch (Exception e) {//訪问出现异常
            // TODO Auto-generated catch block
            Message msg = handler.obtainMessage();
            msg.what = NET_PROBLEM;
            handler.sendMessage(msg);
            e.printStackTrace();
        }

    }
    //这些handler发送的信息交付给handler去处理。做出对应的处理

    
   

Android APP 登陆模块的更多相关文章

  1. 初步探究Android App API接口测试--实战

    一.Android App API接口测试 1.如何学好Android App API接口测试 postman可以用来实现API接口自动化测试,但是也有弊端,无法实现接口测试数据的参数化,为了达到接口 ...

  2. MVP应用在android app上

    使用MVP模式来解耦activity中业务代码和界面代码.在activity中,将其中的业务抽象到presenter层:将其中的界面代码抽象到View层. MVP模式: 一个软件被划分成三层,View ...

  3. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  4. [转]Android App整体架构设计的思考

    1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...

  5. [转]设计一款Android App总结

    开发工具的选择 开发工具我将选用Android Studio,它是Google官方指定的Android开发工具,目前是1.2.2稳定版,1.3的预览版也已经发布了.Android Studio的优点就 ...

  6. 【Bugly安卓开发干货分享】Android APP 快速 Pad 化实现

    项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验.为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目 ...

  7. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  8. How To Use Proguard in Android APP

    在Android开发完成即将发布给用户使用时,还有最后重要的一步:代码混淆,这时候,Proguard就派上用场了,大家谁也不想辛辛苦苦写的代码太容易被别人反编译过来,而Proguard就是帮我们实现这 ...

  9. 【转载】Android app 安全测试调研及执行

    本文来源于:http://testerhome.com/topics/2209 一.通过在线工具进行测试 1.腾讯金刚审计系统http://service.security.tencent.com 优 ...

随机推荐

  1. c# Winform 调用可执行 exe 文件

    c#是一个写windows桌面小工具的好东西,但有个时候,我们需要在 winform 程序中调用其他的 exe 文件,那么该如何实现呢? 如果只是拉起一个 exe 文件,可以参考如下方法实现: str ...

  2. weblogic+idea

    1.首先是weblogic的安装,去官网下载,下载完成后,安装,然后还需要创建域,参考链接: https://www.cnblogs.com/xdp-gacl/p/4140683.html,创建域的h ...

  3. 调整notepad++的行距的方法

    notepad++是一款免费开源的文本编辑器,在windows平台上表现非常好,可以自定义的地方多,还支持主题导入,导出和切换,对各种语言的语法高亮支持也是在各大文本编辑器中名列前茅,插件库的内容也非 ...

  4. CreateMutex函数 (转)

    CreateMutex函数 该函数找出当前系统是否已经存在指定进程的实例.如果没有则创建一个互斥体. CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为: HANDLE ...

  5. Zabbix分布式监控系统实践 自定义配置

    https://www.zabbix.com/wiki/templates/start 环境介绍OS: Ubuntu 10.10 Server 64-bitServers:zabbix-server: ...

  6. rest认证组件,权限组件,频率组件,url注册器,响应器组件,分页器组件

    1.认证组件 1.1 认证组件利用token来实现认证 1.2 token认证的大概流程 用户登录===>获取用户名和密码===>查询用户表 如果用户存在,生成token,否则返回错误信息 ...

  7. Pyhton---基础---递归

    2019-05-21 ------------------------------------------- 一. #类似于栈的先进后出模式def digui(num):    print(num)  ...

  8. 算法-python

    选择排序:一个列表被分为无序列表和有序列表,选择排序就是拿无序列表的第一个和后面的每一个相比较,每一趟选择出最小的一个,添加进有序列表. def select_sort(list): for i in ...

  9. 如何分析及处理 Flink 反压?

    反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题.反压意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,而需要对上游进行限速.由于实时计算应用通 ...

  10. java 构造方法中super()的作用?

    手贱百度了一下 :java里面自定义类的有参构造方法为什么不用super() 举个例子: class Father { Father(){print ('father');}; } class Son ...