前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >羊皮书APP(Android版)开发系列(八)用户登录

羊皮书APP(Android版)开发系列(八)用户登录

作者头像
热心的程序员
发布2018-08-30 10:40:30
4790
发布2018-08-30 10:40:30
举报
文章被收录于专栏:编程之路

用户登录功能是APP中最最常见的功能,看似简单,但也有一些需要注意的地方。

1.用户登录接口调用设计

用户登录模块,必然涉及到服务器接口的调用,而在开发的过程中经常会遇见APP着急使用接口,而服务器接口开发人员还未准备好相应接口的情况,这时候做为App开发者,我们要为自己设计专门的服务类,约定服务器返回Json数据的格式,进行开发。下面以登录接口为例来看下接口的调用。

  • 定义接口配置xml文件url.xml,在res目录下创建xml文件夹,然后创建url.xml,内容如下:
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<url>
    <Node
        IsNet="false"
        Key="login"
        Expires="0"
        NetType="post"
        APIClass="cn.studyou.parchment.service.APILoginService"
        Url="http://www.weather.com.cn/data/sk/" />
</url>
  • 有了接口配置文件,我们就可以定义Url管理工具UrlConfigManager.java,用来判断使用本地测试数据还是直接调用服务器接口。
代码语言:javascript
复制
package cn.studyou.parchment.net;

import android.app.Activity;
import android.content.res.XmlResourceParser;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;

import cn.studyou.parchment.R;
import cn.studyou.parchment.service.APIBaseService;

/**
 * 基本功能:Url管理类
 * 创建:王杰
 * 创建时间:16/3/8
 * 邮箱:w489657152@gmail.com
 */
public class UrlConfigManager {

    private static UrlConfigManager service = null;

    private UrlConfigManager() {

    }

    public static synchronized UrlConfigManager getInstance() {
        if (UrlConfigManager.service == null) {
            UrlConfigManager.service = new UrlConfigManager();
        }
        return UrlConfigManager.service;
    }

    public String getData(final Activity activity,String key) {
        String jsonResult = "";
        XmlResourceParser xmlParser = activity.getApplication().getResources().getXml(R.xml.url);
        int eventCode;
        try {
            eventCode = xmlParser.getEventType();
            while (eventCode != XmlPullParser.END_DOCUMENT) {
                switch (eventCode) {
                    case XmlPullParser.START_DOCUMENT:
                        break;
                    case XmlPullParser.START_TAG:
                        if ("Node".equals(xmlParser.getName())&&key.equals(xmlParser.getAttributeValue(null, "Key"))) {
                            final String isNet = xmlParser.getAttributeValue(null,
                                    "IsNet");
                            if ("true".equals(isNet)) {
                                //网络数据url
                                final String url = xmlParser.getAttributeValue(null,
                                        "Url");
                                jsonResult = url;
                            } else {
                                final String apiClass = xmlParser.getAttributeValue(null,
                                        "APIClass");
                                //本地数据class包名
                                jsonResult = apiClass;
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        break;
                    default:
                        break;
                }
                eventCode = xmlParser.next();
            }
        } catch (final XmlPullParserException e) {
            e.printStackTrace();
        } catch (final IOException e) {
            e.printStackTrace();
        } finally {
            xmlParser.close();
        }
        return jsonResult;
    }

    /**
     * 反射方式获取本地数据
     *
     * @param className
     * @return
     */
    public String invoke(String className) {
        String jsonResult = "";
        try {
            APIBaseService apiBaseService = (APIBaseService) Class.forName(
                    className).newInstance();
            jsonResult = apiBaseService.getJsonData();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return jsonResult;
    }

}
  • 有了UrlConfigManager工具后,在以后的开发中,我们配置好url.xml后, 就可以通过UrlConfigManager来判定登录方式了。在Activity中使用:
代码语言:javascript
复制
String result = UrlConfigManager.getInstance().getData(this, "login");
        boolean isUrl = RegexUtils.checkURL(result);
        if (isUrl) {
        Map headers = new HashMap();
            Map params = new HashMap();
            //请求网络数据
            OkHttpUtils
                    .post()
                    .url(result)
                    .headers(headers)
                    .params(params)
                    .build()
                    .execute(new StringCallback() {
                        @Override
                        public void onError(Call call, Exception e) {
                            L.e("请求数据失败");
                        }

                        @Override
                        public void onResponse(String s) {

                        }
                    });
        } else {
            //使用本地数据
            String jsonResult = UrlConfigManager.getInstance().invoke(result);
            User user = new Gson().fromJson(jsonResult, User.class);
            user.save();
            startMainActivity();
        }
    }
  • 这里用到了User类,User类很简单就是一个实体。上面我们在url.xml配置了一个登录服务类APILoginService,它就是用来提供本地测试数据的类,代码如下:
代码语言:javascript
复制
package cn.studyou.parchment.service;

import com.google.gson.Gson;

import cn.studyou.parchment.entity.User;

/**
 * 基本功能:用户登录服务类
 * 创建:王杰
 * 创建时间:16/3/8
 * 邮箱:w489657152@gmail.com
 */
public class APILoginService extends APIBaseService {
    @Override
    public String getJsonData() {
        User user = new User();
        user.setUserType(1);
        user.setUserName("wangjie");
        user.setSessionId("209EAE20CEF54355B3FC1086CB9CEAE2");
        String jsonStr = new Gson().toJson(user);
        return jsonStr;
    }
}
  • APIBaseService是一个抽象类,其他接口的服务类均继承此类即可。
代码语言:javascript
复制
package cn.studyou.parchment.service;

/**
 * 基本功能:服务器接口服务类
 * 创建:王杰
 * 创建时间:16/3/8
 * 邮箱:w489657152@gmail.com
 */
public abstract class APIBaseService {
    public abstract String getJsonData();
}

2.从用户登录功能过程中总结的几个建议

  • 用户界面中的EditText要配置键盘,下一项或完成,使用android:imeOptions ,优化用户体验,是用户操作简单化,如:
代码语言:javascript
复制
<EditText
            android:id="@+id/activity_login_account_et"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp46"
            android:layout_marginLeft="@dimen/dp40"
            android:layout_marginRight="@dimen/dp40"
            android:layout_marginTop="@dimen/dp60"
            android:background="@drawable/shape_edittext_selector"
            android:hint="@string/account"
            android:imeOptions="actionNext"
            android:singleLine="true"
            android:textColor="@android:color/white"
            android:textColorHint="@android:color/white"
            android:textSize="@dimen/normal" />
  • 访问网络接口不要使用自己封装的http工具,直接使用开源的okhttp或volley。
  • 解析json数据使用开源框架Gson或Jackson、fastjson,不要使用JsonObject直接解析。
  • 使用GsonFormat,可以根据json字符串直接生成java实体,提高效率。
  • 用户登录后的信息若存储到数据库,推荐使用Sqllite数据库框架GreenDao、ormlite、LitePal,我使用的是LitePal,感觉还不错。
  • 为提高效率,建议使用butterknife注解框架,就像Spring的注解一样,很方便。同时为AS安装butterknife插件。
  • Android 一个改善的okHttp封装库,可以参考使用, 项目地址:https://github.com/hongyangAndroid/okhttp-utils博客地址:http://blog.csdn.net/lmj623565791/article/details/49734867
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.03.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.用户登录接口调用设计
  • 2.从用户登录功能过程中总结的几个建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档