1

我创建了一个登录活动,它使用另一个类 - 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,那么它可以切换到其他活动。

4

3 回答 3

3

您不想以这种方式执行此操作。.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();
于 2013-02-12T23:34:59.673 回答
1

你应该搬家

Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class);
            startActivity(casesActivity);
            }else{
                Toast.makeText(getApplicationContext(),"Incorrect Details",     Toast.LENGTH_LONG).show();
            }

进入 LoginService 的 onPostExecute。

这样你就可以确定 asynctask 已经完成了它的工作。

在任何情况下,其他活动开始都很奇怪,这可能是因为 loginSuccess 的旧分配为 true

于 2013-02-12T23:33:14.537 回答
1

如何从异步任务返回结果?

捕获AsyncTaskfrom的结果onPostExecute()

@Override
public void onPostExecute(Boolean result)
{
    boolean loginSuccess = result;

    if(loginSuccess!=false) { 

         Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class);
         startActivity(casesActivity);
    }
    else {

        Toast.makeText(getApplicationContext(),"Incorrect Details", Toast.LENGTH_LONG).show();
    }

}

AsyncTask 中结果的数据类型取决于第三个 Type 参数。

有时我们认为execute()方法AsyncTask会返回一个错误的结果。它将返回一个AsyncTask自身

于 2013-02-12T23:36:40.033 回答