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 ** –