我创建了一个使用另一个类的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,则可以切换到其他活动。
答案 0 :(得分:3)
您不希望以这种方式执行此操作。 .execute()
将尽快开始,但无法保证(并且可能保证不),它会及时将loginSuccess
值恢复给您。< / p>
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();
答案 1 :(得分: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
答案 2 :(得分:1)
如何从asynctask返回结果?
从AsyncTask
抓取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中的结果数据类型取决于第3个Type参数。
有时我们认为execute()
的{{1}}方法会返回错误的结果。它将返回AsyncTask
本身