2016-11-23 105 views
0

我想在android中使用Stormpath框架的登录屏幕。我使用了android studio中提供的标准登录屏幕,并且只修改了UserLoginTask。我的问题是,它似乎并没有等待我的电话Stormpath完成。一旦这个类被调用,它会直接执行doInBackground,然后直接执行onPostExecute。这里是我的课:doInTheBackground不等功能完成?

public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { 

     private final String mEmail; 
     private final String mPassword; 
     private boolean loginResult; 
     String errorMessage; 


     UserLoginTask(String email, String password) { 
      mEmail = email; 
      mPassword = password; 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      Stormpath.login(mEmail, mPassword, new StormpathCallback<Void>() { 
       @Override 
       public void onSuccess(Void aVoid) { 
        Log.d("debug", "sucess"); 
        loginResult = true; 
       } 

       @Override 
       public void onFailure(StormpathError error) { 
        errorMessage = error.message(); 
        Log.d("debug", "Error: " + error.message()); 
        loginResult = false; 
       } 
      }); 
      return loginResult; 
     } 

     @Override 
     protected void onPostExecute(final Boolean success) { 
      mAuthTask = null; 
      showProgress(false); 

      if (success) { 
       finish(); 
      } else { 
       Toast.makeText(LoginActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); 
       mPasswordView.setError(getString(R.string.error_incorrect_password)); 
       mPasswordView.requestFocus(); 
      } 
     } 

     @Override 
     protected void onCancelled() { 
      mAuthTask = null; 
      showProgress(false); 
     } 
    } 
+4

'Stormpath.login()'使用回调函数,因此它看起来已经在后台线程上执行网络调用,并通过回调返回结果。如果这是真的,那么在这种情况下你不需要'AsyncTask'。 – Egor

+0

为什么要等待? 'login()'是一个异步调用,它不会阻塞调用线程。 – earthw0rmjim

+0

@Egor谢谢你可以把它写成一篇文章,所以我可以验证它作为一个答案 –

回答

1

由于Stormpath.login()使用回调,很有可能它已经在做网络调用在后台线程,并通过回调将返回结果。如果是这种情况,那么你并不需要AsyncTask