在我的应用程序中,我使用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;
。正如我所料,应用程序崩溃了。
答案 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()
中(是按钮)启动Tread
或AsyncTask
以从服务器获取令牌。同时,您可以显示Progress dialog(“正在加载...请等待”种类)。
从服务器获得响应后,在Thread
或AsyncTask
中关闭此进度对话框,然后致电doProcess()
。
我假设您根据服务器响应/令牌向用户显示此活动中的一些信息。因此,一旦取消“进度”对话框,您的doProcess()
就可以更新视图。
如果身份验证失败,那么您可以在向用户显示有关失败的finish()
之后,在活动上调用Toast
。
还要确保在“进度”对话框中调用setCancelable(false)
。
答案 1 :(得分:0)
Android对话框是异步的。
所以,你应该做下一个方法: