我创建了一个Login活动,该活动使用另一个类-LoginService,这是用于网络通信的AsyncTask。

 public void onClick(View view) {

            if (editTextPassword.getText().toString() != null & editTextUsername.getText().toString() != null){

                new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString()).execute();

                if(loginSuccess!=false){
                //Used to move to the Cases Activity
                Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class);
                startActivity(casesActivity);
                }else{
                    Toast.makeText(getApplicationContext(),"Incorrect Details", Toast.LENGTH_LONG).show();
                }
             }
            else{
                //Display Toaster for error
                Toast.makeText(getApplicationContext(),"Please enter your details", Toast.LENGTH_LONG).show();
            }
        }


在LoginService完成执行之前,活动已通过Intent变量移至另一个活动。我不懂为什么。 LoginService的想法是验证用户的凭据。如果返回true,则可以切换到其他活动。

最佳答案

您不想以这种方式这样做。 .execute()将尽快开始,但是不能保证(也许不能保证)它会及时将您的loginSuccess值还给您。

new LoginService(...).execute();之后的所有内容都应移到onPostExecute()中:

private Context mContext = null;
public void setContext(Context context) {
    mContext = context;
}
@Override
protected void onPostExecute(Void result) {
    if(loginSuccess!=false){
        //Used to move to the Cases Activity
        Intent casesActivity = new Intent(mContext, CasesActivity.class);
        startActivity(casesActivity);
    }else{
        Toast.makeText(mContext,"Incorrect Details", Toast.LENGTH_LONG).show();
    }
}


然后,您必须像这样调用setContext()

LoginService service = new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString());
service.setContext(getApplicationContext());
service.execute();

10-04 14:09