私は電子メールフィールドとボタンを持つ認証インターフェースを持っています。 ボタンをクリックすると、AsyncTaskは電子メールがGoogleアプリケーションエンジンのデータストアに存在するかどうかを確認する必要があります。 これは私の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;
}}
ので、コードは次のように動作するはずです:
- MainActivity」は与えるべきですConnexionAsyncTaskに「inscrit」変数を設定します。
- ConnexionAsyncTaskは、電子メールがデータストアに存在するかどうかを確認する必要があります。アンは、セッターと「inscrit」変数に結果(Inscritインスタンスまたはnull)を入れ
- MainActivityは「inscrit」はヌルであるかどうかを確認し、私は私のコード私を実行するとトースト
を示すべき私が "[email protected]"を置くと、実際の結果を得るために2回クリックする必要があります。このメールはもちろん、データストアに存在します。初めて "存在しない"と表示されます。 AsyncTaskは検証の直後に値を返します。 私が.execute()。get()で値を返すのであれば動作しますが、UIスレッドをブロックして、進捗ダイアログを表示したいと思います。 コールバックインターフェイスを使用しようとしましたが、どちらも機能しません。
本当にありがとうございます。** AsyncTask **メソッドの後に実行したいメソッドを** onPostExecute **から呼び出す必要があります –