欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android客戶端實現(xiàn)注冊、登錄詳解(1)

 更新時間:2020年05月25日 15:25:20   作者:孤獨戰(zhàn)狼  
這篇文章主要為大家詳細介紹了Android客戶端實現(xiàn)注冊、登錄代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們在開發(fā)安卓App時難免要與服務(wù)器打交道,尤其是對于用戶賬號信息的注冊與登錄更是每個Android開發(fā)人員必須掌握的技能,本文將對客戶端的注冊/登錄功能的實現(xiàn)進行分析,不到之處還請指出。

在這里我們僅討論客戶端如何請求服務(wù)器進行注冊,而服務(wù)器在收到客戶端請求后進行的一系列操作并不在本文所述范圍內(nèi),有興趣大家可以參考

請求服務(wù)器

客戶端在進行用戶信息的注冊和登錄時一般使用post請求(攜帶參數(shù))去服務(wù)器。以volley框架請求服務(wù)器為例,真正與服務(wù)器進行交互的就是如下代碼:

StringRequest request=new StringRequest(Method.POST, url, new Listener<String>() {

 //請求成功
 @Override
 public void onResponse(String s) {
 //執(zhí)行請求成功的回調(diào)
 callback.onSuccess()
 }

 }, new ErrorListener() {

 //請求錯誤
 @Override
 public void onErrorResponse(VolleyError volleyError) {
 //執(zhí)行請求失敗的回調(diào)
 callback.onFailure()
 }
 }){

 //攜帶參數(shù)(Map集合)
 @Override
 protected Map<String, String> getParams() throws AuthFailureError {
 return parames;
 }
 };

 //將請求添加到請求隊列中
 Volley.newRequestQueue(context).add(request);

 當然,我們在請求服務(wù)器成功或失敗時應(yīng)該設(shè)置相應(yīng)的回調(diào)方法,讓我們能夠進行一些操作。
 •callback.onSuccess() //請求成功的回調(diào)
 1.保存用戶注冊信息(SP中和Application中)
 2.跳轉(zhuǎn)到主頁面 

•callback.onFailure() //請求失敗的回調(diào)

 1.提示錯誤信息 

下面通過一個具體的demo來介紹
(聲明:此demo為阿福老師IT藍豹App的代碼截?。?nbsp;

注:我們在與服務(wù)器進行交互時,必須按照規(guī)定的接口和規(guī)則進行請求,這里使用的是IT藍豹App中的服務(wù)器,服務(wù)器的注冊接口數(shù)據(jù)格式如下

 1.url:http://www.itlanbao.com/api/app/users/user_register_Handler.ashx

2.參數(shù)說明
    nickname       必須有    昵稱
    email          必須有    郵箱
    password       必須有    密碼
    accesstoken    必須有    簽名md5(nickname+email+password+"雙方平臺約定公鑰")

3.請求方式:POST

4.返回值格式:

 成功
 {
 "ret":0,
 "errcode":0,
 "msg":"接口調(diào)用成功",
 "data":{
 "userid":"16489",
 "email":"nnn@aaa.com",
 "nickname":"duss",
 "userhead":"http://img.itlanbao.com/avatar.png"
 } 
 }

 失敗
 {
 "ret":1,
 "errcode":1,
 "msg":"接口調(diào)用失敗"
 }

demo演示

主要實現(xiàn)代碼(demo會在文章最后給出)

1.注冊頁面中(RegisterActivity),點擊注冊按鈕

 registBtn.setOnClickListener(new Button.OnClickListener() {

 @Override
 public void onClick(View v) {
 // TODO Auto-generated method stub
 //獲得用戶輸入的信息
 String nick = loginNick.getText().toString();
 String emailStr = email.getText().toString();
 String passwordStr = password.getText().toString();
 if (!TextUtils.isEmpty(nick) &&
 !TextUtils.isEmpty(emailStr)
 && !TextUtils.isEmpty(passwordStr)) {
 if (Utils.isEmail(emailStr)) {//驗證郵箱格式是否符合

 //調(diào)用RequestApiData中的getRegistData()方法進行注冊,傳入用戶輸入的昵稱,郵箱、密碼,以及解析數(shù)據(jù)的bean對象和callback對象(回調(diào)到自身)
 RequestApiData.getInstance().getRegistData(nick, emailStr, passwordStr,
 AnalyticalRegistInfo.class, RegisterActivity.this);
 } else {
 Toast.makeText(RegisterActivity.this, "輸入郵箱有誤", Toast.LENGTH_SHORT).show();
 }
 } else {
 Toast.makeText(RegisterActivity.this, "輸入信息未完全", Toast.LENGTH_SHORT).show();
 }
 }
 });

注意:這個注冊的方法中,我們傳入的最后一個參數(shù)是回調(diào)的對象,這里我們傳入的是RegisterActivity自身,所以它需要實現(xiàn)

HttpResponeCallBack接口
 RequestApiData.getInstance().getRegistData(nick, emailStr, passwordStr,
 AnalyticalRegistInfo.class, RegisterActivity.this);

2.請求服務(wù)器的回調(diào)接口(HttpResponeCallBack)

 public interface HttpResponeCallBack {
 public void onResponeStart(String apiName);

 /**
 * 此回調(diào)只有調(diào)用download方法下載數(shù)據(jù)時才生效
 * 
 * @param apiName
 * @param count
 * @param current
 */
 public void onLoading(String apiName, long count, long current);

 public void onSuccess(String apiName, Object object);

 public void onFailure(String apiName, Throwable t, int errorNo, String strMsg);

}

3.網(wǎng)絡(luò)接口類(RequestApiData)

 public class RequestApiData {
 private static RequestApiData instance = null;
 private HttpResponeCallBack mCallBack = null;

 //創(chuàng)建接口對象
 public static RequestApiData getInstance() {
 if (instance == null) {
 instance = new RequestApiData();
 }
 return instance;
 }

 /**
 * 4.6注冊用戶接口
 * @param nickname 昵稱
 * @param email 郵箱
 * @param password 密碼
 * @param clazz 數(shù)據(jù)返回的解析對象
 * @param callback 回調(diào)
 * 特別要注意參數(shù)位置不能變要根據(jù)文檔來
 * 請求方式:POST
 */
 public void getRegistData(String nickname,String email
 ,String password, Class<AnalyticalRegistInfo> clazz,
 HttpResponeCallBack callback) {
 mCallBack = callback;
 //這是每一個接口的唯一標示
 String tagUrl = UrlConstance.KEY_REGIST_INFO;//注冊接口
 //將注冊的信息保存在map中(須和服務(wù)器端一致)
 HashMap<String, String> parameter = new HashMap<String, String>();
 parameter.put("nickname", nickname);
 parameter.put("email",email);
 parameter.put("password",password);

 //拼接參數(shù)信息,昵稱,郵箱,密碼,公鑰,并用md5進行加密
 StringBuilder builder = new StringBuilder();
 builder.append(nickname);
 builder.append(email);
 builder.append(password);
 builder.append(UrlConstance.PUBLIC_KEY);

 parameter.put(UrlConstance.ACCESSTOKEN_KEY,MD5Util.getMD5Str(builder.toString()));

 //調(diào)用RequestManager的post方法,請求服務(wù)器
 RequestManager.post(UrlConstance.APP_URL,tagUrl, parameter, clazz, callback);

 }
}

 4.網(wǎng)絡(luò)請求處理的類(RequestManager)

 public class RequestManager {
 private static RequestQueue mRequestQueue;
 private static ImageLoader mImageLoader;


 private synchronized static void initRequestQueue() {
 if (mRequestQueue == null) {
 //創(chuàng)建一個請求隊列(使用Volley框架)
 mRequestQueue = Volley.newRequestQueue(ItLanbaoLibApplication.getInstance());
 }
 }


 /**
 * 添加請求到請求隊列中
 * @param request
 * @param tag
 */
 private static void addRequest(Request<?> request, Object tag) {
 if (tag != null) {
 request.setTag(tag);
 }
 mRequestQueue.add(request);
 }

 /**
 * post 請求數(shù)據(jù)
 *
 * @param app_url 公共的接口前綴 http://www.itlanbao.com/api/app/
 * @param tag_url 接口名稱,eg:users/user_register_Handler.ashx(注冊接口)
 * @param parameter 請求參數(shù)封裝對象
 * @param clazz 返回數(shù)據(jù)封裝對象,如果傳null,則直接返回String
 * @param callback 接口回調(diào)監(jiān)聽
 */
 public static <T> void post(final String app_url, final String tag_url, final HashMap<String, String> parameter, Class<T> clazz,
 final HttpResponeCallBack callback) {
 //發(fā)送post請求服務(wù)器
 post(app_url, tag_url, parameter, clazz, callback, Priority.NORMAL);
 }


 /**
 * post 請求數(shù)據(jù)
 *
 * @param app_url 路徑
 * @param url 接口名稱
 * @param parameter 請求參數(shù)封裝對象
 * @param clazz 返回數(shù)據(jù)封裝對象,如果傳null,則直接返回String
 * @param callback 接口回調(diào)監(jiān)聽
 * @param priority 指定接口請求線程優(yōu)先級
 */
 public static <T> void post(final String app_url, final String url, final HashMap<String, String> parameter, final Class<T> clazz,
 final HttpResponeCallBack callback, Priority priority) {
 if (callback != null) {
 callback.onResponeStart(url);//回調(diào)請求開始
 }

 //初始化請求隊列
 initRequestQueue();

 //將公共的接口前綴和接口名稱拼接
 //eg:拼接成注冊的接口 http://www.itlanbao.com/api/app/users/user_register_Handler.ashx
 StringBuilder builder = new StringBuilder(app_url);
 builder.append(url);

 {// 檢查當前網(wǎng)絡(luò)是否可用
 final NetworkUtils networkUtils = new NetworkUtils(ItLanbaoLibApplication.getInstance());

 if (!networkUtils.isNetworkConnected() && android.os.Build.VERSION.SDK_INT > 10) {
 if (callback != null) {
 callback.onFailure(url, null, 0, "網(wǎng)絡(luò)出錯");//回調(diào)請求失敗
 return;
 }
 }
 }

 /**
 * 使用Volley框架真正去請求服務(wù)器
 * Method.POST:請求方式為post
 * builder.toString():請求的鏈接
 * Listener<String>:監(jiān)聽
 */
 StringRequest request = new StringRequest(Method.POST, builder.toString(),
 new Listener<String>() {

 @Override
 public void onResponse(String response) {
 // TODO Auto-generated method stub
 try {
 if (response != null && callback != null) {
 Gson gson = new Gson();
 //回調(diào)請求成功,傳入url和解析的對象
 callback.onSuccess(url, gson.fromJson(response, clazz));

 }

 } catch (Exception e) {
 // TODO: handle exception
 if (callback != null) {
 //回調(diào)請求失敗--解析異常
 callback.onFailure(url, e, 0, "解析異常");
 return;
 }
 }


 }
 }, new ErrorListener() {
 //請求出錯的監(jiān)聽
 @Override
 public void onErrorResponse(VolleyError error) {
 if (callback != null) {
 if (error != null) {
 callback.onFailure(url, error.getCause(), 0,
 error.getMessage());
 } else {
 callback.onFailure(url, null, 0, "");
 }
 }
 }
 }) {
 //post請求的參數(shù)信息
 protected Map<String, String> getParams() {
 return getPostApiParmes(parameter);
 }
 };

 //添加請求到請求隊列中
 addRequest(request, url);
 }


 /*
 * post參數(shù)
 * 
 * ts:時間戳 sign: 接口簽名 parms = 按文檔參數(shù)拼接 parm[0]+ … + parm[n-1] sign =
 * md5(parms+"雙方平臺約定公鑰")
 */
 private static ApiParams getPostApiParmes(final HashMap<String, String> parameter) {
 ApiParams api = new ApiParams();
 for (Entry<String, String> entry : parameter.entrySet()) {
 api.with(entry.getKey(), entry.getValue());
 }
 return api;
 }

}

 5.在請求服務(wù)器成功/失敗后會執(zhí)行回調(diào)方法,而我們傳入的callback對象是自身(RegisterActivity),所以現(xiàn)在我們回到注冊頁面

 @Override
 public void onResponeStart(String apiName) {
 // TODO Auto-generated method stub
 Toast.makeText(RegisterActivity.this, "正在請求數(shù)據(jù)...", Toast.LENGTH_SHORT).show();
 }

 @Override
 public void onLoading(String apiName, long count, long current) {
 Toast.makeText(RegisterActivity.this, "Loading...", Toast.LENGTH_SHORT).show(); 
 }

 @Override
 public void onSuccess(String apiName, Object object) {
 // TODO Auto-generated method stub
 //注冊接口
 if (UrlConstance.KEY_REGIST_INFO.equals(apiName)) {
 if (object != null && object instanceof AnalyticalRegistInfo) {
 AnalyticalRegistInfo info = (AnalyticalRegistInfo) object;
 String successCode = info.getRet();
 //請求成功
 if (successCode.equals(Constant.KEY_SUCCESS)) {
 UserBaseInfo baseUser = new UserBaseInfo();
 baseUser.setEmail(info.getEmail());
 baseUser.setNickname(info.getNickname());
 baseUser.setUserhead(info.getUserhead());
 baseUser.setUserid(String.valueOf(info.getUserid()));
 ItLanBaoApplication.getInstance().setBaseUser(baseUser);
 UserPreference.save(KeyConstance.IS_USER_ID, String.valueOf(info.getUserid()));
 UserPreference.save(KeyConstance.IS_USER_ACCOUNT, info.getEmail());
 UserPreference.save(KeyConstance.IS_USER_PASSWORD, password.getText().toString());


 Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
 RegisterActivity.this.startActivity(intent);

 Toast.makeText(RegisterActivity.this, "注冊成功...", Toast.LENGTH_SHORT).show();

 RegisterActivity.this.finish();

 } else {
 Toast.makeText(RegisterActivity.this, "注冊失敗", Toast.LENGTH_SHORT).show();
 }
 }
 }

 }

 @Override
 public void onFailure(String apiName, Throwable t, int errorNo, String strMsg) {
 Toast.makeText(RegisterActivity.this, "Failure", Toast.LENGTH_SHORT).show();
 } 

demo下載地址

至此,安卓客戶端的注冊功能就實現(xiàn)了,下一篇中將會介紹登錄和自動登錄的實現(xiàn),盡請關(guān)注。

相關(guān)文章

最新評論