我有一个带有电子邮件字段和按钮的身份验证界面。
当我单击按钮时,AsyncTask应该验证电子邮件是否存在于Google App Engine数据存储中。
这是我的asyncTask的代码:
public class ConnexionAsyncTask extends AsyncTask<Object, Object, Inscrit> {
private static InscritApi inscritApi = null;
private Context context;
String email;
ProgressDialog dialog;
public ConnexionAsyncTask(Context context, String email) {
this.context = context;
dialog = new ProgressDialog(context);
this.email = email;
}
@Override
protected void onPreExecute() {
dialog.setMessage("Connexion en cours");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Inscrit doInBackground(Object... params) {
if (inscritApi == null) {
InscritApi.Builder builder = new InscritApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null)
.setRootUrl( // some url );
inscritApi = builder.build();
}
try {
return inscritApi.get(email).execute();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Inscrit inscrit) {
MainActivity main = (MainActivity) context;
main.setInscrit(inscrit);
dialog.dismiss();
}}
这是MainActivity代码:
public class MainActivity extends AppCompatActivity {
Inscrit inscrit;
Button btncnx;
EditText emailcnx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btncnx = (Button) findViewById(R.id.btncnx);
emailcnx = (EditText) findViewById(R.id.emailcnx);
btncnx.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ConnexionAsyncTask task = new ConnexionAsyncTask(MainActivity.this, emailcnx.getText().toString());
task.execute();
if (inscrit == null)
Toast.makeText(MainActivity.this, "not exist", Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this, "exist", Toast.LENGTH_SHORT).show();
}
});
}
public void setInscrit(Inscrit inscrit) {
this.inscrit = inscrit;
}}
所以代码应该像这样工作:
MainActivity应该为ConnexionAsyncTask提供“ inscrit”变量
ConnexionAsyncTask应该验证电子邮件是否存在于数据存储中,然后使用设置器将结果(Inscrit实例或null)放入“ inscrit”变量中
MainActivity应该验证“ inscrit”是否为空并显示吐司
当我运行我的代码时,我必须单击2次才能获得真实的结果,例如,如果我输入“ [email protected]”,而该电子邮件当然存在于数据存储中,则它将第一次显示“不存在”,并且存在第二秒钟,这意味着AsyncTask在验证后立即返回值。
如果我使用.execute()。get()返回值,则可以工作,但它会阻塞ui线程,并且我想显示进度对话框。
我尝试使用回调接口,但它也不起作用。
最佳答案
你应该检查一下
if (inscrit == null)
Toast.makeText(MainActivity.this, "not exist", Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this, "exist", Toast.LENGTH_SHORT).show();
在您的AsyncTask完成执行之后。基本上,您可以安全地检查inPostrit onPostExecute的空性。