用户登录功能是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封装库,可以参考使用,
项目地址:https://github.com/hongyangAndroid/okhttp-utils博客地址:http://blog.csdn.net/lmj623565791/article/details/49734867