I haven't read your code-snippet, but here is how i would do it:

When the user wants to login, do a showDialog(idDialogLogin),
containing the username/password fields Login/Cancel buttons.

When Login is pressed, dismiss the dialog and start a progress-dialog
and the actual logging in. Handle this through an AsyncTask:
onPreExecute shows the progress dialog. The background task does the
actual logging in (through http). onPostExecute either hides it
(successful login) or just does a showDialog(idDialogLogin) again of
the login-dialog on an unsuccessful login.

When cancel is pressed, just dismiss the dialog.

On Jan 25, 9:47 am, qmwestview <qmwestv...@googlemail.com> wrote:
> Hi there,
>
> I am having a problem about repeating Login dialog (an AlertDialog)
> and progress dialog, coordinating with http thread. I suppose
> repetitive Login dialog (if fail, continue) handling should be common
> and straightforward. I guess my approach must be wrong somewhere. I
> already spent 2 days on this and am desperate. So please help.
>
> The usecase is like this:
>
> I have a main activity.
>
> User starts the app, the main activity starts.
> Show a login dialog (generated by the main thread, i.e. from onCreate
> ()). The main thread then starts a wait_thread, which will wait for
> http to return data and check the data and decide what to do.
>
> After user input username/password and press login, a progress dialog
> starts.
>
> The progress dialog starts an http_thread to talk to the server and
> get replies. Once done, it will notify the waiting thread.
>
> If the user type in the right username password first time, the code
> works fine.
>
> But it always fail for 2nd time Login, i.e. When first login fail
> (wrong username/password), the wait_thread will generate 2nd Login
> dialog to let user repeat the login process. But after user hit the
> login on this 2nd Login dialog, the system always crashes.
>
> The exception here is:
>
> ERROR/AndroidRuntime(21880): Uncaught handler: thread main exiting due
> to uncaught exception
> ERROR/AndroidRuntime(21880): android.view.ViewRoot
> $CalledFromWrongThreadException: Only the original thread that created
> a view hierarchy can touch its views.
>
> The followings are part of the code.
>         ...
> public class Test extends Activity implements Constants,Runnable{
>     ...
>
>     @Override
>     public void onCreate(Bundle savedInstanceState) {
>         ...
>         showDialog(DIALOG_LOGIN); //
>                 startHttpWaitThread();
>     }
>
>     private void startHttpWaitThread(){
>         try {
>                 Thread dialogThread  = new Thread(this);
>                 dialogThread.start();
>                 } catch(Exception e){
>                 //showDialog(DIALOG_LOGIN);
>             }
>     }
> /*     �...@override
>         public void onStart() {
>                 super.onStart();
>         } */
>
>     public void run(){
>         Looper.prepare();
>
>                 try {
>                 synchronized(httpReplyData){ // httpReplyData holds all needed
> data returned from server
>                         httpReplyData.wait();
>                 }
>                 } catch(Exception e) {
>                         e.printStackTrace();
>                 }
>                 if 
> (httpReplyData.getHttpResult()!=HTTP_REPLY_STATUS_CODE_OK_200)
> showDialog(DIALOG_LOGIN);
>         Looper.loop();
>     }
>
>     @Override
>     protected Dialog onCreateDialog(int id) {
>         switch (id) {
>         case DIALOG_LOGIN:
>                 return getLoginDialog(this);//,
>         case DIALOG_LOGIN_PROGRESS:
>                 return new LoginProgressDialog
> (ctxForLoginProgressDialog);//        }
>         return null;
>     }
>
>     private Dialog getLoginDialog(Context ctx) {//, String name,
> String pwd){
>         ...
>                 dialogBuilder.setPositiveButton(R.string.login, new
> DialogInterface.OnClickListener() {
>             public void onClick(DialogInterface dialog, int
> whichButton) {
>                         networkService.startHttpThread
> (HTTP_REQUEST_LOGIN_INDEX, getUsername(), getPassword()); //
> networkService is the HTTP manager
>                         showDialog(DIALOG_LOGIN_PROGRESS); //
>                         startHttpWaitThread();
>                 }
>             });
>         return dialogBuilder.create();
>     }
>
>     private class LoginProgressDialog extends ProgressDialog
> implements Constants{
>         //private ProgressThread progressThread;
>                 public LoginProgressDialog(Context ctx){
>                         super(ctx);
>                         ...
>                 }
>     }
>
> }
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
> I also tried second approach, which moves the wait_thread into
> progress dialog class/object, following Google’s “Creating a
> ProgressDialog” (http://developer.android.com/guide/topics/ui/
> dialogs.html#ProgressDialog). The 2nd login dialog is started by the
> progress dialog. Its wait() method gets called ONLY once (that is
> before 3nd showDialog(DIALOG_LOGIN) gets called). Seems to me the
> unfinished progressDialog’s thread blocks new progressDialog to be
> generated, I mean, when new showDialog(DIALOG_LOGIN_PROGRESS) called,
> the system will continue to use last progressDialog which has already
> responded to the first notify call and won’t respond to the notify
> call any more. So although the http thread handles well and call
> notify in due time, no one is waiting for that notify. Thus the system
> just hungs, while progress dialog is doing it animation endlessly.
>
> The followings are part of the code:
>         …
> public class Test {// extends Activity implements Constants {
>         ...
>         @Override
>     public void onCreate(Bundle savedInstanceState) {
>                 ...
>         showDialog(DIALOG_LOGIN); //
>     }
>
>         ...
>     @Override
>     protected Dialog onCreateDialog(int id) {
>         switch (id) {
>         case DIALOG_LOGIN:
>                 return getLoginDialog(this);//
>         case DIALOG_LOGIN_PROGRESS:
>                 return new LoginProgressDialog(ctxForLoginProgressDialog);//
>         }
>         return null;
>     }
>     private Dialog getLoginDialog(Context ctx) {//, String name,
> String pwd){
>         ...
>                 dialogBuilder.setPositiveButton(R.string.login, new
> DialogInterface.OnClickListener() {
>             public void onClick(DialogInterface dialog, int
> whichButton) {
>                         ...
>                         
> networkService.startHttpThread(HTTP_REQUEST_LOGIN_INDEX,
> username, password);
>                         showDialog(DIALOG_LOGIN_PROGRESS); //
>                 }
>             });
>         return dialogBuilder.create();
>     }
>
>     private class LoginProgressDialog extends ProgressDialog
> implements Constants{
>         private ProgressThread progressThread;
>                 public LoginProgressDialog(Context ctx){
>                         ...
>                         progressThread = new ProgressThread(handler);
>             progressThread.start();
>                 }
>             final Handler handler = new Handler() {
>                 public void handleMessage(Message msg) {
>                         int httpStatusCode = 
> msg.getData().getInt("httpStatusCode");
>
>                     if (httpStatusCode == HTTP_REPLY_STATUS_CODE_OK_200){
>                         dismissDialog
> (DIALOG_LOGIN_PROGRESS);
>                     } else showDialog(DIALOG_LOGIN);
>                 }
>             };
>             private class ProgressThread extends Thread {
>                 Handler handler;
>                 ProgressThread(Handler handler){
>                         this.handler = handler;
>                 }
>                 public void run() {
>                         try {
>                                 synchronized(httpReplyData){
>                                         httpReplyData.wait();
>                                 }
>                         } catch(Exception e) {
>                                 e.printStackTrace();
>                         }
>                         Message msg = handler.obtainMessage();
>                 Bundle b = new Bundle();
>                 b.putInt("httpStatusCode", httpReplyData.getHttpResult
> ());
>                 msg.setData(b);
>                 handler.sendMessage(msg);
>                 }
>             }
>         }}
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> How should I correct the logic? Any help would be truly appreciated

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to