2016-08-11 7 views
0

Ich habe eine AsyncTask, die in der onCreate Methode ausgeführt wird. Mein ProgressDialog wird jedoch nicht angezeigt. Und vom Debuggen wird bestätigt, dass die AsyncTask ausgeführt wird.Android: ProgressDialog nicht in AsyncTask aufgerufen in OnCreate() aufgerufen

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_lifestyle); 
     context = getApplicationContext(); 

     new testAsync().execute(); 
} 

private class testAsync extends AsyncTask<Void,Void,Void> { 
     private ProgressDialog pDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(MainActivity.this); // tried with context, no difference 
      pDialog.setTitle("Inserting sample data"); 
      pDialog.setMessage("Please wait. This dialog will be dismissed upon completion."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TableControllerReadings TCR = new TableControllerReadings(context); 
      // TCR.insertSampleData(getApplicationContext()); 

      new Timer().schedule(new TimerTask() { 
       @Override 
       public void run() { 
       //delay for 5 seconds 
       } 
      }, 5000); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void v) { 
      pDialog.dismiss(); 
     } 
    } 

Antwort

1

Nehmen Sie pDialog.dismiss(); in die Ihre Timer-Thread.

Grund:onPostExecute() sofort aufrufen, weil im Hintergrund Aufgabe abgeschlossen ist.

Sein seprate Faden, der auf Verzögerung ist so Cursor auf die onPostExecute()

private class testAsync extends AsyncTask<Void, Void, Void> { 
     private ProgressDialog pDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(MainActivity.this); // tried with context, no difference 
      pDialog.setTitle("Inserting sample data"); 
      pDialog.setMessage("Please wait. This dialog will be dismissed upon completion."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TableControllerReadings TCR = new TableControllerReadings(context); 
      // TCR.insertSampleData(getApplicationContext()); 

      new Timer().schedule(new TimerTask() { 
       @Override 
       public void run() { 
        //delay for 5 seconds 
        pDialog.dismiss(); 
       } 
      }, 5000); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void v) { 
     // pDialog.dismiss(); 
     } 
    } 
+0

kai versuchen Sie diesen Code –

+0

Okay, das funktioniert gut. Nicht sicher, wo schief gelaufen ist, aber danke! –

+0

Wenn Ihr Problem beheben Sie bitte Häkchen. –

1

Aktivität zeigt keine Ansicht bis onResume Methode aufgerufen wird. Wenn die Ausführung AsyncTask vor dem Aufruf onResume beendet wird, wird die ProgressDialog nicht angezeigt.

Also besser Anruf new testAsync().execute(); in onResume

+0

Es funktioniert immer noch nicht. Kein Unterschied –

+0

es ist nicht obligatorisch, onresume anzurufen oder oncreate es die Logik oder das Design, die entscheiden, wann zu zeigen. –

+0

Ich werde die Logik an meinem Ende ändern, wenn die asynctask in 'onResume' ausgeführt wird. Ich nehme meinen vorherigen Kommentar zurück, anscheinend funktioniert es jetzt. –

0

hinzufügen pDialog.show(); in doInBackground und fügt in new testAsync().execute(); onResume

+0

Die Methode '.show()' muss im UI-Thread aufgerufen werden. Wenn ich es in 'doInBackground' klicke, kann ich" Handler in Thread erstellen, der Looper.prepare() nicht aufgerufen hat "nicht erzeugen. –

+0

legen Sie es in einen Thread –

0

Den Code funktioniert gut mit Thread.sleep (5000); Wenn Sie eine Verzögerung hinzufügen möchten, verwenden Sie stattdessen Thread.Sleep (/ Zeit in milisec /) anstelle von Timer.Schedule. Wegen der Timer.Schedule async Task wird so schnell ausgeführt, bevor ein Dialogfeld angezeigt wird.

Verwandte Themen