ログイン画面の実装
次に、ログイン画面の実装を説明します。LoginActivity.java
ファイルに実装されています。
ログイン画面の各要素は、レイアウトファイル login.xml
で定義されており、クラス内の実装と次のように結びついています。
onCreate()
メソッドで 2 つのTextView
を Java のフィールドmUsernameField
とmPasswordField
に関連付けます。ボタンの
onClick
ハンドラーをhandleLogin()
メソッドとhandleSignUp()
メソッドに設定します。ProgressDialog
をmProgress
に関連付けて、待機中のアニメーションを制御できるようにしています(以下、ProgressDialog
の説明は省略しています)。
ユーザー作成
初めに、ユーザー作成の処理を説明します。"Sign Up" ボタンがタップされると、handleSignUp()
メソッドが実行されます。このメソッドの処理を抜粋すると、以下のようになります(本質的ではない部分は削除しています)。
String username = mUsernameField.getText().toString();
String password = mPasswordField.getText().toString();
// Create a KiiUser object.
KiiUser user = KiiUser.createWithUsername(username);
// Register the user asynchronously.
user.register(new KiiUserCallBack() {
public void onRegisterCompleted(int token, KiiUser user, Exception e) {
if (e == null) {
// Go to the main screen.
Intent myIntent = new Intent(LoginActivity.this, MainActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
showToast("Error Registering: " + e.getLocalizedMessage());
}
}
}, password);
ユーザー名とパスワードを Android SDK を使って画面から取得し、
username
とpassword
とします。createWithUsername()
メソッドにusername
を渡して、メモリ上にKiiUser
インスタンスを作成します。register()
メソッドを呼び出します。指定されたユーザーを Kii Cloud 上に作成するリクエストが SDK からサーバーに送信されます。password
がregister()
メソッドの第 2 引数である点にご注意ください。
ノンブロッキング API
ネットワーク呼び出しには時間がかかるため、register()
などの API は、ノンブロッキング API として実装されています。Android モバイルアプリでは、ユーザーインターフェイスの処理をメインスレッドが行っています。メインスレッドがネットワーク呼び出しで待ち状態になると、モバイルアプリ全体がフリーズしてしまいます。この問題を防止する仕組みがノンブロッキング API です。
逆に、API の実行完了まで待つのがブロッキング API です。ブロッキング API は自分で作業スレッドを作成して呼び出す場合に使用します。ほとんどの API ではブロッキング API とノンブロッキング API の両方が用意されており、リファレンスガイドでも両方のコード例を扱っています。
以下にユーザー登録でのノンブロッキング API のシーケンス図を示します。
メインスレッドで register()
メソッドを呼び出すと SDK 内部で作業スレッドが作成され、メソッドはすぐに制御を返します。ネットワーク呼び出しは作業スレッドで実行されるため、この間もユーザーは画面を操作できます。
ネットワーク呼び出しが完了した後、次のイベント処理のタイミングで、メインスレッドによって onRegisterCompleted()
メソッドがコールバックとして呼び出されます。そのため、コールバックにスレッドに関する同期処理は不要です。
実行順序
API 周辺の実行順序は、以下の順番になる点にご注意ください。
// Step 1
user.register(user.register(new KiiUserCallBack() {
public void onRegisterCompleted(int token, KiiUser user, Exception e) {
// Step 3
}
}, password);
// Step 2
register()
の実行完了後に行いたい処理は、Step 3
の場所に記述します。Step 2
の時点では register()
の処理が終わっていません。たとえば、Step 2
の箇所にユーザー登録後の処理を書いても、その時点では作成処理が始まった直後であるため、多くはエラーとなります。
なお、API を連続で呼び出す処理をコールバックの内部に追加していくと、ネストが深くなってプログラムの見通しが悪くなります。プログラムの可読性を保つには、独自の作業スレッドを作成してブロッキング API を使用したり、Promise が使えるライブラリを使用したりする方法があります。
結果処理
メソッド呼び出しの結果処理は、KiiUserCallBack
クラスの onRegisterCompleted()
メソッドの内部に記述します。
API を呼び出した際、どのクラスの、どのメソッドを使用すればよいかは、リファレンスガイドのコードサンプルに記載されています。この後のステップで作業例を示します。
ユーザー登録処理での実装をもう一度記載します。
// Register the user asynchronously.
user.register(new KiiUserCallBack() {
public void onRegisterCompleted(int token, KiiUser user, Exception e) {
if (e == null) {
// Go to the main screen.
Intent myIntent = new Intent(LoginActivity.this, MainActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
showToast("Error Registering: " + e.getLocalizedMessage());
}
}
}, password);
API 呼び出しの結果処理では、まず、例外の有無の判断が必要です。ノンブロッキング API ではネットワークアクセスが行われるため、ネットワークエラーを初めとしたエラーの発生を常に考慮する必要があります。これは、register()
だけに限らず、他のすべてのノンブロッキング API に共通しています。
Hello Kii では以下の処理を行います。
成功時
Exception
の変数e
が null の場合は実行に成功したことを意味します。登録したユーザーでログインしている状態になっています。データ一覧画面に遷移するために
MainActivity
を呼び出します。このとき、ユーザーがログインした状態は、SDK 内のスタティック変数に保持されており、
MainActivity
で使用することができます。失敗時
e
が null 以外の場合は、SDK 内で発生した例外がe
に格納されています。ここではgetLocalizedMessage()
メソッドでメッセージを取得してトーストを表示しています。エラーの内容によって処理を分岐したい場合、
e
の型をinstanceof
演算子で調べたり、エラーコードを取得したりできます。
なお、onRegisterCompleted()
メソッドの引数 token
は非同期処理自体の識別子ですが、現在はサポートしていない API がほとんどであるため、実装時には無視してください。
ログイン
ログイン処理は、呼び出す API が異なるだけで、実装方法はユーザー作成と同じです。
"Log In" ボタンがタップされると、handleLogIn()
メソッドが実行されます。このメソッドの処理を抜粋すると、以下のようになります。
String username = mUsernameField.getText().toString();
String password = mPasswordField.getText().toString();
// Authenticate the user asynchronously.
KiiUser.logIn(new KiiUserCallBack() {
public void onLoginCompleted(int token, KiiUser user, Exception e) {
if (e == null) {
// Go to the main screen.
Intent myIntent = new Intent(LoginActivity.this, MainActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
showToast("Error registering: " + e.getLocalizedMessage());
}
}
}, username, password);
ユーザー作成と同様に、ユーザー名とパスワードを Android SDK を使って画面から取得します。
次に、logIn()
メソッドの引数にそれらを渡してログイン処理を行います。正しい場合、モバイルアプリはログイン状態となります。
logIn()
メソッドもネットワークアクセスを伴うノンブロッキング API であるため、完了後の処理は onLoginCompleted()
メソッド内に記述します。
成功時
Exception
の変数e
が null の場合は、ログイン成功です。MainActivity
に遷移します。このとき、ユーザーがログインした状態は、SDK 内のスタティック変数に保持されており、
MainActivity
で使用することができます。失敗時
e
が null 以外の場合、ユーザー作成が失敗した場合と同様にエラーメッセージを表示します。
カレントユーザー
前述のように、ログインやユーザー登録が成功したとき、「カレントユーザー」としてログイン中のユーザーが SDK 内で保持されます。このユーザーは次のように取得できます。
KiiUser user = KiiUser.getCurrentUser();
取得されるユーザーは、ログインメソッドのコールバックの引数 user
と同じユーザーです。
ユーザーを取得すると、そのユーザーのユーザースコープの Bucket にアクセスするなどの様々な操作ができます。
モバイルアプリがバックグラウンドになった場合など、Android によってプロセスが再起動されるとスタティック変数に保持されているログイン状態が失われ、getCurrentUser()
メソッドは null を返します。ログイン状態を保持する方法はこのページの最後に示しますが、Hello Kii ではこの処理を実装していません。
次は...
データ一覧画面の処理について説明します。ここではデータの登録や取得を行う API の使用方法などを見ていきます。
データ一覧画面の実装 に移動してください。
より詳しく学びたい方へ
- ブロッキング API とノンブロッキング API の詳細は ブロッキング API vs. ノンブロッキング API を参照してください。
- ユーザー作成とログインの実装方法の詳細は ユーザー作成、ログイン を参照してください。
- 本文中、「ログイン状態」と表現していた情報はアクセストークンを意味します。アクセストークンの概要は ログインとアクセストークン を参照してください。
- Android によって Activity が再作成されたときにログイン状態を保持する方法は Android での実装における注意点 をご覧ください。また、モバイルアプリを起動し直したときにも保持したい場合は SDK による保存情報からのログイン の実装方法をご覧ください。実装例は Kii Balance でも確認できます。