用户登录功能是APP中最最常见的功能,看似简单,但也有一些需要注意的地方。
用户登录模块,必然涉及到服务器接口的调用,而在开发的过程中经常会遇见APP着急使用接口,而服务器接口开发人员还未准备好相应接口的情况,这时候做为App开发者,我们要为自己设计专门的服务类,约定服务器返回Json数据的格式,进行开发。下面以登录接口为例来看下接口的调用。
<?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>
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;
}
}
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();
}
}
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;
}
}
package cn.studyou.parchment.service;
/**
* 基本功能:服务器接口服务类
* 创建:王杰
* 创建时间:16/3/8
* 邮箱:w489657152@gmail.com
*/
public abstract class APIBaseService {
public abstract String getJsonData();
}
<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" />