1

我有一个带有电子邮件字段和按钮的认证接口。 当我点击按钮时,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应该给“ inscrit“变量连接到ConnexionAsyncTask
  2. ConnexionAsyncTask应该验证电子邮件是否存在于数据存储区中,而不是恩把结果(Inscrit实例或空)在“inscrit”变量与二传手
  3. 在MainActivity应核实是否“inscrit”为空或不是,并显示举杯

,当我运行我的代码必须点击两次以获得真实结果,例如,如果我放入“[email protected]”,并且当然这封电子邮件存在于数据存储库中,它将首次向我显示“不存在”并存在于第二次,这意味着AsyncTask在验证之后返回值。 如果我用.execute()。get()返回值,但它会阻止ui线程,并且我想显示一个进度对话框。 我试过使用回调接口,但它也不起作用。

回答

2

你应该做的检查您的AsyncTask完成

if (inscrit == null) 
    Toast.makeText(MainActivity.this, "not exist", Toast.LENGTH_SHORT).show(); 
else 
    Toast.makeText(MainActivity.this, "exist", Toast.LENGTH_SHORT).show(); 

后执行。基本上,你可以安全地检查onExpressExccute上的inscrit nullability。

+0

谢谢你真的有效,我只需要添加我希望它在** AsyncTask **之后执行的方法,并从** onPostExecute ** –