因此,让我们说用户输入正确的凭据,然后点击按钮进行登录,我必须单击两次才能登录。我认为这是因为我在AsyncTask的开头宣布它但我不确定
我希望它如何工作:用户输入正确的凭据,他们单击按钮,AsyncTask调用我的服务器并确保凭据正确并将变量设置为false(所以我知道登录工作)和然后活动就开始了。
AsyncTask代码:
public class BackgroundTask extends AsyncTask <String,Void,String> {
Context ctx;
public static boolean LOGIN_FAILED = true;
public static String Account;
BackgroundTask(Context ctx){
this.ctx = ctx;
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
//removed extra code here for the question. This is where i get result
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
if(result.equals("Login failed...")){
//If there email or password didn't match up in the DB then they couldn't log in.
LOGIN_FAILED = true;
}else{
LOGIN_FAILED = false;
if (result.equals("Welcome: Buyer")){
Account = "Buyer";
}else if(result.equals("Welcome: Seller")){
Account = "Seller";
}
}
}
}
按钮代码(单击按钮时调用此方法):
public void startActivity() {
//If the user gets the credentials right when they sign in then i start the activity.
if (BackgroundTask.LOGIN_FAILED == false) {
if (BackgroundTask.Account.equals("Buyer")) {
startActivity(new Intent(getApplicationContext(), BuyerHomePage.class));
} else if (BackgroundTask.Account.equals("Seller")) {
startActivity(new Intent(getApplicationContext(), SellerHomePage.class));
}
}else if(BackgroundTask.LOGIN_FAILED == true){
//A TOAST shows up (because the user couldn't connect) saying they messed up there email or password.
Toast.makeText(SignInForm.this, "Email or password incorrect", Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:1)
根据您共享的代码,您无处调用AsyncTask。
假设:假设在startActivity()中调用了异步。然后,如果您调用异步任务,则检查BackgroundTask.LOGIN_FAILED
....
那是错误的做法。异步将在后台发生,因此在任务完成之前,您的代码会检查BackgroundTask.LOGIN_FAILED
。
正确的方法是在完成onPostExecute()
答案 1 :(得分:0)
在您的按钮中单击您正在开始活动,但在您的描述中,您指示您打电话给服务器。哪一个是正确的?在验证凭据之前,为什么要在按钮单击时启动活动?
此外,假设您的服务进行异步调用以验证凭据,您不需要异步任务来调用它,服务应立即从活动的“验证凭据”调用返回,并且一旦有验证凭据后,它应通过回调方法回调您的活动。