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는 제공해야 " inscrit "변수를 ConnexionAsyncTask에 연결
  2. ConnexionAsyncTask는 전자 메일이 데이터 저장소에 있는지 여부를 확인해야합니다. 욕실은 세터와 함께 "inscrit"변수에 결과 (Inscrit 인스턴스 또는 null)를 넣어
  3. MainActivity는 "inscrit는"널 (null)인지 여부를 확인하고 난 내 코드 I을 실행하면 건배

를 표시해야합니다 예를 들어 "[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 nullability onPostExecute를 확인해도 안전합니다.

+0

정말 고마워요. 그냥 ** AsyncTask ** 후에 메서드를 호출하고 ** onPostExecute **에서 호출하도록 추가해야합니다. –