1

私は電子メールフィールドとボタンを持つ認証インターフェースを持っています。 ボタンをクリックすると、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; 
}} 

ので、コードは次のように動作するはずです:

  1. MainActivity」は与えるべきですConnexionAsyncTaskに「inscrit」変数を設定します。
  2. ConnexionAsyncTaskは、電子メールがデータストアに存在するかどうかを確認する必要があります。アンは、セッターと「inscrit」変数に結果(Inscritインスタンスまたはnull)を入れ
  3. MainActivityは「inscrit」はヌルであるかどうかを確認し、私は私のコード私を実行するとトースト

を示すべき私が "[email protected]"を置くと、実際の結果を得るために2回クリックする必要があります。このメールはもちろん、データストアに存在します。初めて "存在しない"と表示されます。 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(); 

をチェックしないはずです。基本的に、inscritのNULL可否onPostExecuteを確認するのは安全です。

+0

本当にありがとうございます。** AsyncTask **メソッドの後に実行したいメソッドを** onPostExecute **から呼び出す必要があります –