Android,活动的生命周期使p.roblem从对话框中获取结果

时间:2011-12-21 11:37:43

标签: android dialog lifecycle

在我的应用程序中,我使用onCreate()来初始化应用程序,onStart()和onResume()。

根据活动生命周期,所有提到的方法都是按顺序运行的。在onStart()方法中,我有一个自定义对话框,在运行时,我将用户ID和密码发送到服务器,然后服务器向我发送令牌。

然后在获取令牌后,我应该进入下一步,即onResume()。

但问题是在从onStart()显示对话框后,活动将转到下一个循环,onResumme()。我怎么能对android,"嘿家伙说,请不要进入下一个周期,直到我从服务器取出令牌"

这是我的代码:

@Override
    protected void onStart() {
        super.onStart();
        Log.i("MA_onStart", "Activity is abut to start...");

    .
    .
    .

        if(!isOnline())
        dialogWarning.show();


        if(!isTokenValid())
            dialog.show();
    }
}

在这段代码中,我调用isTokenValid()。如果没有令牌,那么我将显示一个用于获取用户ID和密码的对话框。我希望活动不会进入下一阶段,直到我得到令牌。我可以添加while循环来包装

  

if(!isTokenValid())dialog.show();

并设置一个标志来打破循环。我可以在用户单击对话框中的“是”按钮时设置标志,但我担心如果进程需要几秒钟,Android会终止我的进程和应用程序。你的建议是什么?

由于

==========> 的更新

我将代码更改为此

gotoNextCycle = true;
            while(gotoNextCycle)
            if(!isTokenValid())
                dialog.show();

并在用户单击对话框中的“是”按钮时放置gotoNextCycle = false;。正如我所料,应用程序崩溃了。

2 个答案:

答案 0 :(得分:0)

如果让Android继续循环,会出现什么问题。
我的意思是如果调用onResume()将会发生什么?

您不应该在onStart()onResume()等待来自服务器的回复 如您所见,这将导致ANR 您可以更新您的应用,以便一旦您从服务器获得有效令牌的响应,您就可以刷新活动中显示的视图或数据。
也许,让我们知道您在Activity中显示的信息,我们可以尝试帮助您处理无效令牌情况(从服务器获取令牌并更新信息)。

修改

您可以参考以下代码:

@Override
protected void onResume() {
    super.onResume();

    if(isTokenValid()) {
       doProcess();
    } else {
       showDialog(USER_ID_DLG);
    }
  }

private void doProcess() {
   .... 
}

在对话框的onClick()中(是按钮)启动TreadAsyncTask以从服务器获取令牌。同时,您可以显示Progress dialog“正在加载...请等待”种类)。 从服务器获得响应后,在ThreadAsyncTask中关闭此进度对话框,然后致电doProcess()

我假设您根据服务器响应/令牌向用户显示此活动中的一些信息。因此,一旦取消“进度”对话框,您的doProcess()就可以更新视图。

如果身份验证失败,那么您可以在向用户显示有关失败的finish()之后,在活动上调用Toast

还要确保在“进度”对话框中调用setCancelable(false)

答案 1 :(得分:0)

Android对话框是异步的。

所以,你应该做下一个方法:

  1. 创建AsyncTask,
  2. 在onPreExecute show对话框中
  3. doInBackground中的
  4. 执行所有网络游行
  5. 在onPostExecute中关闭对话框,使用收到的数据更新屏幕。