2017-02-07 7 views
0

Ich versuche, einen Fortschrittsdialog anzuzeigen, wenn auf die Anmeldeschaltfläche geklickt wird. Aber der Fortschrittsdialog wird nur angezeigt, wenn ich das Ende meiner Methode onClick erreiche. Und nicht der Anfang. In der SignIn-Methode mache ich eine asynctask, um den Server zu erreichen. Also die ganze Zeit dauern durch die asynctask, es wird kein Fortschrittsdialog angezeigt. Nur wenn das Ende der onClick-Methode erreicht ist, wird der Fortschrittsdialog angezeigt. Jemand weiß, was mache ich falsch?Android-Fortschrittsdialog wird erst am Ende der onClick-Methode angezeigt

public void onClick(View view) { 
      progressDialog = new ProgressDialog(SignIn.this); 
      progressDialog.setMessage("Sign in in progress"); 
      progressDialog.setTitle("Please wait"); 
      progressDialog.setCancelable(false); 
      progressDialog.setIndeterminate(true); 

      progressDialog.show(); 

      repSignIn = signIn(SignIn.this, etEmail.getText().toString(), etPassword.getText().toString()); 


      if(!repSignIn.hasError()) 
      { 
       Toast.makeText(getApplicationContext(), "Sign In successfully", Toast.LENGTH_SHORT).show(); 
       onBackPressed(); 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(), repSignIn.getErrorMessage(), Toast.LENGTH_SHORT).show(); 
      } 
      //progressDialog.cancel(); 
     } 

Vielen Dank im Voraus

Nadine

Antwort

0

Statt progressDialog in onClick zu haben, müssen Sie es in onPreExecute Ihre AsyncTask setzen und es in onPostExecute entlassen.

Der Grund ist AsyncTask verwendet einen Worker-Thread, der asynchron sein wird, und das ist der Grund, warum progressDialog endet vor erwartet.

class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected void onPreExecute() { 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
    // do your stuff 
    return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
    progressDialog.dismiss(); 
    } 
} 
+0

Aber die asynctask ist innerhalb einer Bibliothek (die ich entwickle). Also ich möchte den Fortschrittsdialog nicht in onProExecute stellen ... ich möchte vor dem Start die asynctask anzeigen ... – Banana

+0

Gibt es einen Callback von der Bibliothek, gibt die asyncTask irgendetwas zurück? –

+0

In der Methode in librairy, rufe ich die asynctask an und ich warte darauf Ergebnis. String Ergebnis = new sendDataToServer(). Execute (URL, "PUT", jsonData.toString()). Get(); Es ist das Problem? – Banana

0

In Async Aufgabe überschreiben OnPreExecute() -Methode und dort müssen Sie den Fortschrittsbalken angezeigt ..

private void signIn(your parameters here) { 
     new AsyncTask<Void, Void, Void>(){ 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       progressDialog = new ProgressDialog(SignIn.this); 
       progressDialog.setMessage("Sign in in progress"); 
       progressDialog.setTitle("Please wait"); 
       progressDialog.setCancelable(false); 
       progressDialog.setIndeterminate(true); 
       progressDialog.show(); 
      } 

      @Override 
      protected void doInBackground(Void... params) { 
       //your logic here 
      } 

      @Override 
      protected void onPostExecute(JSONObject response) { 
       super.onPostExecute(response); 
       progressDialog.dismiss(); 
      } 
      }.execute(); 
    } 

this helps

0

Verwenden Sie Ihre Fortschritte dailog in Asyntask. Initialisieren und starten Sie Ihren Dialog in onPreExecute und schließen Sie den Dialog in onPostExecute. für mich arbeiten,

@Override 
protected void onPreExecute() { 
    progress = new ProgressDialog(UpdateActivity.this); 
    progress.setCancelable(false); 
    progress.setMessage("Please wait data is Processing"); 
    progress.show(); 
} 
@Override 
protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 
    progress.dismiss(); 

} 
Verwandte Themen