AutoRoomApp 2
完成联网验证登陆,获取数据。
登陆
- 已经登陆 –》直接进入
- 未登陆 –》 登陆
思路:
- 通过SharedPreferences将用户名保存到手机中
- 进入的时候先验证这里是否有数据
此方法很容易被ROOT后的手机修改配置文件破解~
public class SPUtil {
/**
* 存储数据
* @param mContext 上下文
* @param data 保存的数据
* @param flag key值
*
*/
public static void saveInfoToLocal(Context mContext, String data, String flag){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = sp.edit();
editor.putString(flag,data);
editor.commit();
}
/**
* 返回存储的数据
* @param mContext
* @param flag key值
* @return
*/
public static String getInfoFromLocal(Context mContext, String flag){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
String username = sp.getString(flag,"");
return username;
}
}
具体过程:
splashActivity验证
- 本地获取是否有用户名登陆
private void isLogin() { // 获取本地的账号 String str = SPUtil.getInfoFromLocal(this, Constant.USERNAME); if (TextUtil.isEmpty(str)) { return; } else { // 全局变量,验证是否能登陆 isLogin = true; } }
- 联网验证,POST数据(使用自己搭建的服务器)
使用 okhttp3(建议使用第三方的库), 详细说明看原网站
okhttp3的使用
- 配置文件得在
android:name=".application.MyApplication"
配置
上传到服务器确认账号密码是否正确
- 配置文件得在
public void checkOnNet(){ OkHttpUtils .post() .url(Constant.URLLOGIN) .addParams("username", username) .addParams("password", password) .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { Log.d(TAG, "onError: "); Toast.makeText(LoginActivity.this,"网络异常,请稍后再试",Toast.LENGTH_SHORT).show(); return; } @Override public void onResponse(String response, int id) { Log.d(TAG, "onResponse: " + response); try { JSONObject jsonObject = new JSONObject(response); String result = jsonObject.getString("result"); Log.d(TAG, "onResponse: "+ response); if (result.equals("1")) { // 将数据存储到sp中 SPUtil.saveInfoToLocal(LoginActivity.this, response,Constant.BUILDINGJSON); loginSuccess(); } else { Toast.makeText(LoginActivity.this, "账号或密码错误",Toast.LENGTH_SHORT).show(); return; } } catch (JSONException e) { e.printStackTrace(); } } }); } public void loginSuccess(){ SPUtil.saveInfoToLocal(this,username,Constant.USERNAME); Toast.makeText(this,"登陆成功",Toast.LENGTH_SHORT).show(); startMainActivity(); }
- JSON数据的解析
验证正确返回数据
{"result":1,"time":"2017-10-12 21:45:38","building":[{"buildingId":1,"buildingName":"二教楼东一","classroom":[{"classroomName":"101","classroomId":1,"lampTotal":9,"lamp":4},{"classroomName":"102","classroomId":2,"lampTotal":9,"lamp":5}]}]}
验证失败返回数据
{"result":0,"time":"2017-10-12 21:45:38"}
- 数据解析,这里只解析
result
,暂时用判断是否验证正确
使用
jsonObject
进行解析,记住抛出异常@Override public void onResponse(String response, int id) { try { // 1. 获取result的值 JSONObject jsonObject = new JSONObject(response); String result = jsonObject.getString("result"); Log.d(TAG, "onResponse: "+ response); // 2. 如果是1则验证成功,保存数据到本地,且跳转到主页面 if (result.equals("1")) { // 2.1 将数据存储到sp中 SPUtil.saveInfoToLocal(LoginActivity.this, response,Constant.BUILDINGJSON); loginSuccess(); } else { Toast.makeText(LoginActivity.this, "账号或密码错误",Toast.LENGTH_SHORT).show(); return; } } catch (JSONException e) { e.printStackTrace(); } }
注销登陆
- 在个人信息栏进行注销事件的注册
- 思路: 把
SharedPreferences
里的数据清空,即床底“”
值。
// 注销登陆 private void reLogin() { // 传递“”进去 SPUtil.saveInfoToLocal(mContext, "", Constant.USERNAME); Intent intent = new Intent(mContext, LoginActivity.class); startActivity(intent); } @Override protected void initData() { super.initData(); String username = SPUtil.getInfoFromLocal(mContext, Constant.USERNAME); tv_username.setText(username); }
总结:
- okhttp3的文件配置?
- 自己编写一个类MyApplication**继承Application。 2. 然后在配置文件+上 **name属性
- 简单的json的数据解析?
简单的使用JSONObject就行,详细看上面代码部分。
注册明天继续~