Android 클 라 이언 트 등록,로그 인 상세 설명 실현(1)

13002 단어 Android책.로그 인
저 희 는 안 드 로 이 드 앱 을 개발 할 때 서버 와 접촉 하 는 것 을 피하 기 어렵 습 니 다.특히 사용자 계 정 정보의 등록 과 로그 인 은 모든 안 드 로 이 드 개발 자 들 이 반드시 파악 해 야 할 기능 입 니 다.본 고 는 클 라 이언 트 의 등록/로그 인 기능 의 실현 을 분석 하고 부족 한 점 을 지적 해 주 십시오.

여기 서 우 리 는 클 라 이언 트 가 어떻게 서버 에 등록 을 요청 하 는 지 에 대해 서 만 토론 합 니 다.서버 가 클 라 이언 트 의 요청 을 받 은 후에 진행 하 는 일련의 조작 은 본 고 에서 말 한 범위 에 있 지 않 습 니 다.관심 이 있 으 시 면 참고 하 실 수 있 습 니 다.
요청 서버
클 라 이언 트 는 사용자 정보의 등록 과 로그 인 을 할 때 보통 post 요청(매개 변수 휴대)을 사용 하여 서버 에 갑 니 다.volley 프레임 워 크 요청 서버 를 예 로 들 면 서버 와 상호작용 을 하 는 것 은 다음 과 같은 코드 입 니 다.

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

 //    
 @Override
 public void onResponse(String s) {
 //         
 callback.onSuccess()
 }

 }, new ErrorListener() {

 //    
 @Override
 public void onErrorResponse(VolleyError volleyError) {
 //         
 callback.onFailure()
 }
 }){

 //    (Map  )
 @Override
 protected Map<String, String> getParams() throws AuthFailureError {
 return parames;
 }
 };

 //           
 Volley.newRequestQueue(context).add(request);

 물론 서버 의 성공 이나 실 패 를 요청 할 때 해당 하 는 리 셋 방법 을 설정 하여 작업 을 할 수 있 도록 해 야 합 니 다.
 •callback.onSuccess()/성공 적 인 리 셋 요청
 1.사용자 등록 정보 저장(SP 와 애플 리 케 이 션 중)
 2.홈 페이지 로 이동 
•callback.onFailure()/실패 한 리 셋 요청
 1.오류 알림 
다음은 구체 적 인 demo 를 통 해 소개 하 겠 습 니 다.
(성명:이 demo 는 아 복 선생님 의 IT 블 루 표범 App 코드 를 캡 처 합 니 다) 
주:저 희 는 서버 와 상호작용 을 할 때 규정된 인터페이스 와 규칙 에 따라 요청 해 야 합 니 다.여 기 는 IT 블 루 표범 App 의 서버 를 사용 합 니 다.서버 의 등록 인터페이스 데이터 형식 은 다음 과 같 습 니 다.
 1.url:http://www.itlanbao.com/api/app/users/user_register_Handler.ashx
2.매개 변수 설명
    nickname       반드시 있어 야 한다    애칭
    email          반드시 있어 야 한다    메 일 박스
    password       반드시 있어 야 한다    비밀 번호
    accesstoken    반드시 있어 야 한다    서명 md5(nickname+email+password+"쌍방 플랫폼 약정 공개 키")
3.요청 방식:POST
4.반환 값 형식:

   
 {
 "ret":0,
 "errcode":0,
 "msg":"      ",
 "data":{
 "userid":"16489",
 "email":"[email protected]",
 "nickname":"duss",
 "userhead":"http://img.itlanbao.com/avatar.png"
 } 
 }

   
 {
 "ret":1,
 "errcode":1,
 "msg":"      "
 }
데모 데모 데모

주요 구현 코드(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)) {//          

 //  RequestApiData  getRegistData()      ,         ,  、  ,       bean   callback  (     )
 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();
 }
 }
 });
주의:이 등록 방법 에서 우리 가 들 어 온 마지막 매개 변 수 는 리 셋 대상 입 니 다.여기 서 우리 가 들 어 온 것 은 Register Activity 자체 이기 때문에 이 를 실현 해 야 합 니 다.

HttpResponeCallBack  
 RequestApiData.getInstance().getRegistData(nick, emailStr, passwordStr,
 AnalyticalRegistInfo.class, RegisterActivity.this);
2.서버 의 리 셋 인터페이스 요청(HttpResponseCallBack)

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

 /**
 *        download          
 * 
 * @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.네트워크 인터페이스 클래스(RequestApiData)

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

 //      
 public static RequestApiData getInstance() {
 if (instance == null) {
 instance = new RequestApiData();
 }
 return instance;
 }

 /**
 * 4.6      
 * @param nickname   
 * @param email   
 * @param password   
 * @param clazz          
 * @param callback   
 *                   
 *     :POST
 */
 public void getRegistData(String nickname,String email
 ,String password, Class<AnalyticalRegistInfo> clazz,
 HttpResponeCallBack callback) {
 mCallBack = callback;
 //            
 String tagUrl = UrlConstance.KEY_REGIST_INFO;//    
 //         map (        )
 HashMap<String, String> parameter = new HashMap<String, String>();
 parameter.put("nickname", nickname);
 parameter.put("email",email);
 parameter.put("password",password);

 //      ,  ,  ,  ,  ,  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()));

 //  RequestManager post  ,     
 RequestManager.post(UrlConstance.APP_URL,tagUrl, parameter, clazz, callback);

 }
}
 4.네트워크 요청 처리 클래스(RequestManager)

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


 private synchronized static void initRequestQueue() {
 if (mRequestQueue == null) {
 //        (  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     
 *
 * @param app_url         http://www.itlanbao.com/api/app/
 * @param tag_url     ,eg:users/user_register_Handler.ashx(    )
 * @param parameter         
 * @param clazz         ,   null,     String
 * @param callback       
 */
 public static <T> void post(final String app_url, final String tag_url, final HashMap<String, String> parameter, Class<T> clazz,
 final HttpResponeCallBack callback) {
 //  post     
 post(app_url, tag_url, parameter, clazz, callback, Priority.NORMAL);
 }


 /**
 * post     
 *
 * @param app_url   
 * @param url     
 * @param parameter         
 * @param clazz         ,   null,     String
 * @param callback       
 * @param priority            
 */
 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);//      
 }

 //       
 initRequestQueue();

 //               
 //eg:         http://www.itlanbao.com/api/app/users/user_register_Handler.ashx
 StringBuilder builder = new StringBuilder(app_url);
 builder.append(url);

 {//           
 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, "    ");//      
 return;
 }
 }
 }

 /**
 *   Volley          
 * Method.POST:     post
 * builder.toString():     
 * Listener<String>:  
 */
 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();
 //      ,  url      
 callback.onSuccess(url, gson.fromJson(response, clazz));

 }

 } catch (Exception e) {
 // TODO: handle exception
 if (callback != null) {
 //      --    
 callback.onFailure(url, e, 0, "    ");
 return;
 }
 }


 }
 }, new ErrorListener() {
 //       
 @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       
 protected Map<String, String> getParams() {
 return getPostApiParmes(parameter);
 }
 };

 //          
 addRequest(request, url);
 }


 /*
 * post  
 * 
 * ts:    sign:      parms =         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.서버 성공/실 패 를 요청 한 후 리 셋 방법 을 실행 합 니 다.저희 가 들 어 오 는 콜백 대상 은 자신(Register Activity)이기 때문에 지금 은 등록 페이지 로 돌아 갑 니 다.

 @Override
 public void onResponeStart(String apiName) {
 // TODO Auto-generated method stub
 Toast.makeText(RegisterActivity.this, "      ...", 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 다운로드 주소
이로써 안 드 로 이 드 클 라 이언 트 의 등록 기능 이 실현 되 었 습 니 다.다음 편 에 서 는 로그 인과 자동 로그 인의 실현 을 소개 할 것 이 니 주목 하 시기 바 랍 니 다.

좋은 웹페이지 즐겨찾기