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

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

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

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

  • 定义接口配置xml文件url.xml,在res目录下创建xml文件夹,然后创建url.xml,内容如下:
<?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,用来判断使用本地测试数据还是直接调用服务器接口。
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中使用:
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,它就是用来提供本地测试数据的类,代码如下:
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是一个抽象类,其他接口的服务类均继承此类即可。
package cn.studyou.parchment.service;

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

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

  • 用户界面中的EditText要配置键盘,下一项或完成,使用android:imeOptions ,优化用户体验,是用户操作简单化,如:
<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封装库,android大神之作,项目地址:https://github.com/hongyangAndroid/okhttp-utils
    博客地址:http://blog.csdn.net/lmj623565791/article/details/49734867


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值