[OS 2.2]非同期処理後の画面遷移の方法

1,157 views
Skip to first unread message

つづき

unread,
Dec 14, 2010, 1:33:38 AM12/14/10
to 日本Androidの会
初めて投稿します、つづきと申します。
先週からAndroid OS2.2でアプリを作り出しました。
VB.NET、C#.NETなどを5年経験してます。Javaをカスタマイズで半年ほどいじくった程度です。

■やりたいこと
・「ログイン(Webサービスで認証)して、メニュー画面に遷移する」という所で悩んでおります。

■考えていること
・ログイン処理(Web認証+ローカルDBの更新等)に若干の時間がかかると想定して、
 非同期で処理を実行しようとしています。

■やってみたこと
1.ログイン画面-ログインボタン の onClick イベントで非同期処理(AsyncTask)を実行します。
  Login task = new Login();
  task.execute(userid, pass);

  // 認証できたらメニューへ遷移(if文で判断したい)
  Intent menuIntent = new Intent(this, MenuActivity.class);
  startActivity(menuIntent);

しかし、task.executeはvoidなので、戻り値による判断ができません。

2.また、AsyncTaskクラス内のonPostExecuteメソッドで結果が受け取れるとあったので、
 if (!result) {
  Intent menuIntent = new Intent(this, MenuActivity.class)
  startActivity(menuIntent)
 }
 とやってみましたが、thisは LoginActivity.Login となってしまい、コンパイルできません。
 (private class Login extends AsyncTask と、プライベートクラスにしています)

  Intent menuIntent = new Intent(LoginActivity, MenuActivity.class)
  と試しましたが、コンパイルエラーでした。

というところで詰まっております。説明が足りませんでしたら補足致します。

いろんなサイトを探してみましたが、「非同期処理後に画面表示」はあっても
「非同期処理後に画面遷移」はありませんでした。
みなさんどのようにやっているか、ご教授ください。

GRANOESTE

unread,
Dec 14, 2010, 3:17:17 AM12/14/10
to android-g...@googlegroups.com
こんちは。

インナークラスでしたら、
Intent menuIntent = new Intent(LoginActivity.this, MenuActivity.class)
で、コンパイルエラーは解決すると思いますよ。

でわでわ
---
GRANOESTE

2010年12月14日15:33 つづき <bigtsu...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

Masaki Natsuki

unread,
Dec 14, 2010, 3:30:18 AM12/14/10
to android-g...@googlegroups.com
Natsukiです

LoginActivityクラスとLoginクラスがどのような中身かわからないので想像でお答えします。

1.は
http://developer.android.com/reference/android/os/AsyncTask.html
にあるとおりで、

class Login extends AsyncTask<A,B,C>
CをStringにしてみると、doInBackgroundの戻り値とonPostExecuteの引数がString型になるとおもいます。

2.は
Loginクラスの中で記述しているとして、
Intent menuIntent = new Intent(this, MenuActivity.class)

Intent menuIntent = new Intent(LoginActivity.this, MenuActivity.class)
ではないでしょうか


2010年12月14日15:33 つづき <bigtsu...@gmail.com>:

むらせ

unread,
Dec 14, 2010, 4:24:16 AM12/14/10
to android-g...@googlegroups.com
村瀬です。

1.ですが、自分はAsyncTaskになれてないのでスレッドつかってやってるんですが、画面遷移はログインスレッドの方で行っています。
UIスレッドの方ではログインスレッドのインスタンスを保持しておいて、インスタンスを保持している間は新たにログインスレッドを作成しないよう にしています。
また、併せてAlertDialogでログイン中の表示を行ってユーザの入力をさせないようにしています。
この場合はUIスレッド以外で画面遷移を行うので、Handlerを使うようにしてください。

2.ですが、Natsukiさんの方法が出来なければLoginのインスタンスにLoginActivityのthisを渡してやって、 Intentをnewするところでそのthisを利用すればよろしいんじゃないでしょうか。
ちなみに自分は処理自体はLoginActivityの方に実装していてRunnableのrun()からLoginActivityのログイン 処理メソッドを呼び出すようにしています。

Loginをこんな感じ(↓)にしてやって
class Login {
    private LoginActivity m_Activity;
    Login(LoginActivity act){m_Activity = act;}
}

Intent menuIntent = new Intent(m_Activity, MenuActivity.class)
こんな具合で。

つづき

unread,
Dec 14, 2010, 9:30:54 PM12/14/10
to 日本Androidの会
GRANOESTE 様

 Intent menuIntent = new Intent(LoginActivity.this,
MenuActivity.class)
 で一気に解決しました。思い通りの処理となりました。
Contextに型を指定していたのでコンパイルエラーだったのですね(汗

 どうもありがとうございました。

On 12月14日, 午後5:17, GRANOESTE <granoe...@gmail.com> wrote:
> こんちは。
>
> インナークラスでしたら、
> Intent menuIntent = new Intent(LoginActivity.this, MenuActivity.class)
> で、コンパイルエラーは解決すると思いますよ。
>
> でわでわ
> ---
> GRANOESTE
>
> 2010年12月14日15:33 つづき <bigtsuzuki...@gmail.com>:

つづき

unread,
Dec 14, 2010, 9:31:40 PM12/14/10
to 日本Androidの会
> class Login extends AsyncTask<A,B,C>
> CをStringにしてみると、doInBackgroundの戻り値とonPostExecuteの引数がString型になるとおもいます。

 はい。C の部分は理解できていました。
 質問が悪かったのですが「バックグラウンド(AsyncTask)処理からUIスレッドに値を渡すには」と聞けば良かったです。

 コンパイルエラーの件、ご指摘ありがとうございます。
 無事に解決しました。どうもありがとうございました。


On 12月14日, 午後5:30, Masaki Natsuki <markyk...@gmail.com> wrote:
> Natsukiです
>
> LoginActivityクラスとLoginクラスがどのような中身かわからないので想像でお答えします。
>
> 1.はhttp://developer.android.com/reference/android/os/AsyncTask.html
> にあるとおりで、
>
> class Login extends AsyncTask<A,B,C>
> CをStringにしてみると、doInBackgroundの戻り値とonPostExecuteの引数がString型になるとおもいます。
>
> 2.は
> Loginクラスの中で記述しているとして、
> Intent menuIntent = new Intent(this, MenuActivity.class)
> を
> Intent menuIntent = new Intent(LoginActivity.this, MenuActivity.class)
> ではないでしょうか
>
> 2010年12月14日15:33 つづき <bigtsuzuki...@gmail.com>:
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。

つづき

unread,
Dec 14, 2010, 9:32:36 PM12/14/10
to 日本Androidの会
村瀬様

 new Thread(new Runnable() {・・・について調べてみました。(参考ページ:http://
d.hatena.ne.jp/sy-2010/20100125/1264391774
 比べて見ると、AsyncTackの方が比較的簡単なようでした。(参考ページ:http://d.hatena.ne.jp/
sy-2010/20100127/1264565612)

 また、バックグラウンドからUIスレッドに値を渡す方法も勉強しました。(参考ページ:http://blog.livedoor.jp/
grs_man/archives/51636268.html)
 仰るようにHandlerを使用した方法でした。

 今回は利用する機会がありませんでしたが、とても参考になりました。
 どうもありがとうございました。


On 12月14日, 午後6:24, むらせ <uron...@gmail.com> wrote:
> 村瀬です。
>
> 1.ですが、自分はAsyncTaskになれてないのでスレッドつかってやってるんです
> が、画面遷移はログインスレッドの方で行っています。
> UIスレッドの方ではログインスレッドのインスタンスを保持しておいて、インス
> タンスを保持している間は新たにログインスレッドを作成しないよう にしてい
> ます。
> また、併せてAlertDialogでログイン中の表示を行ってユーザの入力をさせない
> ようにしています。
> この場合はUIスレッド以外で画面遷移を行うので、Handlerを使うようにしてく
> ださい。
>
> 2.ですが、Natsukiさんの方法が出来なければLoginのインスタンスに
> LoginActivityのthisを渡してやって、 Intentをnewするところでそのthisを利
> 用すればよろしいんじゃないでしょうか。
> ちなみに自分は処理自体はLoginActivityの方に実装していてRunnableのrun()か
> らLoginActivityのログイン 処理メソッドを呼び出すようにしています。
>
> Loginをこんな感じ(↓)にしてやって
> class Login {
> private LoginActivity m_Activity;
> Login(LoginActivity act){m_Activity = act;}
>
> }
>
> Intent menuIntent = new Intent(m_Activity, MenuActivity.class)
> こんな具合で。
>
> (2010/12/14 17:30), Masaki Natsuki wrote:
>
>
>
>
>
>
>
> > Natsukiです
>
> > LoginActivityクラスとLoginクラスがどのような中身かわからないので想像で
> > お答えします。
>
> > 1.は
> >http://developer.android.com/reference/android/os/AsyncTask.html
> > にあるとおりで、
>
> > class Login extends AsyncTask<A,B,C>
> > CをStringにしてみると、doInBackground の戻り値とonPostExecuteの引数が
> > String型になるとおもいま す。
>
> > 2.は
> > Loginクラスの中で記述しているとして、
> > Intent menuIntent = new Intent(this, MenuActivity.class)
> > を
> > Intent menuIntent = new Intent(LoginActivity.this, MenuActivity.class)
> > ではないでしょうか
>
> > 2010年12月14日15:33 つづき <bigtsuzuki...@gmail.com
> > <mailto:bigtsuzuki...@gmail.com>>:
>
> > 初めて投稿します、つづきと申します。
> > 先週からAndroid OS2.2でアプリを作り出しました。
> > VB.NET <http://VB.NET>、C#.NETなどを5年経験してます。Javaをカスタ
> > <mailto:android-g...@googlegroups.com> にメールを送信してく
> > ださい。
> > このグループから退会するには、android-group-
> > japan+un...@googlegroups.com
> > <mailto:android-group-japan%2Bunsu...@googlegroups.com> にメー
> > ルを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-
> > japan?hl=ja からこのグループにアクセスしてください。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送
> > られています。
> > このグループに投稿するには、android-g...@googlegroups.com
> > メールを送信してください。
> > このグループから退会するには、android-group-
> > japan+un...@googlegroups.com にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-
> > japan?hl=ja からこのグループにアクセスしてください。
Reply all
Reply to author
Forward
0 new messages