Androidクライアントの登録、登録の詳細(1)
私たちはAndroidアプリを開発する時、サーバーと関わることが避けられません。特にユーザーアカウント情報の登録と登録はAndroid開発者ごとに身につけなければならない技能です。ここではクライアントの登録/登録機能の実現を分析します。
ここでは、クライアントがどのようにサーバに登録を要求するかについてのみ議論しますが、サーバがクライアントの要求を受けた後に行う一連の動作は、本明細書では説明されていないので、ご参考ください。
要求サーバ
クライアントは、ユーザ情報の登録や登録を行う際には、一般的にpost要求(パラメータ持参)を使用してサーバに行きます。vollyフレームワーク要求サーバを例にとって、本当にサーバとインタラクションするのは以下のコードです。
•calback.onSuccess()//成功の返事をお願いします。
1.ユーザ登録情報を保存する(SPとApplicationで)
2.ホームページにジャンプする
•calback.onFailure()//失敗の返事をお願いします。
1.エラーメッセージ
具体的なデモを紹介します。
(声明:このデモは福先生ITアザラシアプリのコードの切り取りです。)
注:私たちはサーバーと対話する時、規定のインターフェースとルールに従って要求しなければなりません。ここで使っているのはITアザラシのアプリのサーバーです。サーバの登録インターフェースのデータフォーマットは以下の通りです。
1.url:http://www.itlanbao.com/api/app/users/user_レジスターHandler.asx
2.パラメータ説明
nikname 必ずあります ニックネーム
email 必ずあります メールボックス
password 必ずあります パスワード
accesstoken 必ずあります 署名md 5(nikname+email+password+「双方のプラットフォームが公開鍵を約束する」)
3.要求方式:POST
4.戻り値の書式:
主にコードを実現します。
1.登録ページに登録し、登録ボタンをクリックします。
これで、Androidクライアントの登録機能が実現しました。次のページでは登録と自動登録の実現を紹介しますので、ご注意ください。
ここでは、クライアントがどのようにサーバに登録を要求するかについてのみ議論しますが、サーバがクライアントの要求を受けた後に行う一連の動作は、本明細書では説明されていないので、ご参考ください。
要求サーバ
クライアントは、ユーザ情報の登録や登録を行う際には、一般的にpost要求(パラメータ持参)を使用してサーバに行きます。vollyフレームワーク要求サーバを例にとって、本当にサーバとインタラクションするのは以下のコードです。
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);
もちろん、サーバーの成功や失敗を要求する時は、相応のコールバック方法を設定して、いくつかの操作ができます。•calback.onSuccess()//成功の返事をお願いします。
1.ユーザ登録情報を保存する(SPとApplicationで)
2.ホームページにジャンプする
•calback.onFailure()//失敗の返事をお願いします。
1.エラーメッセージ
具体的なデモを紹介します。
(声明:このデモは福先生ITアザラシアプリのコードの切り取りです。)
注:私たちはサーバーと対話する時、規定のインターフェースとルールに従って要求しなければなりません。ここで使っているのはITアザラシのアプリのサーバーです。サーバの登録インターフェースのデータフォーマットは以下の通りです。
1.url:http://www.itlanbao.com/api/app/users/user_レジスターHandler.asx
2.パラメータ説明
nikname 必ずあります ニックネーム
email 必ずあります メールボックス
password 必ずあります パスワード
accesstoken 必ずあります 署名md 5(nikname+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":" "
}
デモ主にコードを実現します。
1.登録ページに登録し、登録ボタンをクリックします。
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.要求サーバのコールバックインターフェース(HttpReponeCallBack)
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.ネットワークインターフェース類(RequestApple Data)
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.ネットワーク要求処理のクラス(Request Manager)
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.サーバの成功/失敗を要求すると、コールバックの方法が実行されますが、私たちが入ってきたコールバックの対象は自身です。だから、今は登録ページに戻ります。
@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();
}
デモダウンロードこれで、Androidクライアントの登録機能が実現しました。次のページでは登録と自動登録の実現を紹介しますので、ご注意ください。