AsyncTask返回值延迟



我有一个带有电子邮件字段和按钮的身份验证界面。当我点击按钮AsyncTask应该验证电子邮件是否存在于谷歌应用程序引擎数据存储。这是我的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;
}}
所以代码应该是这样的:
  1. MainActivity应该给ConnexionAsyncTask一个" inscript "变量
  2. ConnexionAsyncTask应该验证电子邮件是否存在于数据存储中,然后用setter
  3. 将结果(Inscrit实例或null)放在"Inscrit"变量中。
  4. MainActivity应该验证"inscript"是否为空,并显示toast

当我运行我的代码时,我必须点击2次才能得到真正的结果,例如,如果我把"user@gmail.com"和这个电子邮件当然存在于数据存储中,它会第一次显示我"不存在",并且存在第二秒,这意味着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完成执行之后。基本上,在onPostExecute上检查inscriptnullability是安全的。

最新更新