1

Je suis en train de faire une tâche avec un Asynctask dans android.comment afficher le dialogue pendant doInBackground(). Asynctask

class GetItemNames extends AsyncTask<CosmeConnection, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(CosmeConnection... cosme) { 
     ContentValues cv; 
     cosme[0].orderListOfNames(); 
     while(!(cosme[0].getState() == CosmeStates.RECEIVED_LIST_OF_NAMES)){} 
     DBHandler dbHandler = new DBHandler(getApplicationContext()); 
     SQLiteDatabase db = dbHandler.getReadableDatabase(); 
     if(db != null){ 
      db.delete(DBHandler.TABLE_SERVER_ITEM, null, null); 

      String[] nombres = cosme[0].getExistingNames().getListOfNames().toString().replaceAll("[\\[\\]]", "").split(","); 
      for (String str : nombres){ 
       cv = new ContentValues(); 
       cv.put(DBHandler.SERVER_ITEM_NAME, str); 
       cv.put(DBHandler.SERVER_ITEM_NAME, "N"); 
       try{ 
        db.insert(DBHandler.TABLE_SERVER_ITEM, null, cv); 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
     db.close(); 
     dbHandler.close(); 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... progress) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 

    } 
} 

Je lance cette asyncktask comme ceci:

new GetItemNames().execute(cosme, null, null); 

Je veux montrer une boîte de dialogue wiht le message "obtenir lis des noms de serveur", tandis que doInBackGround() est en cours d'exécution. J'ai essayé de le faire de cette façon:

protected void onProgressUpdate(String... progress) { 
     String title = getString(R.string.received_list_of_names_title); 
     String msg = getString(R.string.received_list_of_names_msg); 
     DialogHelper.getAlertDialog(getApplicationContext(), title, msg); 
} 

DialogHelper est juste une classe qui gèrent les boîtes de dialogue, getAlertDialog() mehots affiche un dialogue d'alerte normale avec un titre et un message.

Mais cela ne fonctionne pas, je n'arrive pas à comprendre comment afficher une boîte de dialogue qui s'ouvre automatiquement et se ferme lorsque "doInBackGround()" est terminé.

Comment puis-je faire cela?

Merci beaucoup!

EDIT: après essayer la suggestion que j'ai cette exception:

09-21 14:07:21.966: E/AndroidRuntime(22016): FATAL EXCEPTION: main 
09-21 14:07:21.966: E/AndroidRuntime(22016): Process: tfc.unizar.blasmobile, PID: 22016 
09-21 14:07:21.966: E/AndroidRuntime(22016): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.view.ViewRootImpl.setView(ViewRootImpl.java:643) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.app.Dialog.show(Dialog.java:286) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at tfc.unizar.blasmobile.BagContent$GetItemNames.onPreExecute(BagContent.java:263) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.os.AsyncTask.execute(AsyncTask.java:535) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at tfc.unizar.blasmobile.BagContent.onOptionsItemSelected(BagContent.java:133) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.app.Activity.onMenuItemSelected(Activity.java:2633) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1040) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:184) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.widget.AbsListView.performItemClick(AbsListView.java:1152) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3014) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.widget.AbsListView$3.run(AbsListView.java:3865) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.os.Handler.handleCallback(Handler.java:808) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.os.Handler.dispatchMessage(Handler.java:103) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.os.Looper.loop(Looper.java:193) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at android.app.ActivityThread.main(ActivityThread.java:5296) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at java.lang.reflect.Method.invokeNative(Native Method) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at java.lang.reflect.Method.invoke(Method.java:515) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
09-21 14:07:21.966: E/AndroidRuntime(22016): at dalvik.system.NativeStart.main(Native Method) 

L'application est fermée par la force après. Toute suggestion?

+0

duplication possible de [tâche asynchrone pour afficher un AlertDialog] (http://stackoverflow.com/questions/6494002/async-task-to-show-an-alertdialog) – Selvin

Répondre

1
private ProgressDialog mProgress; 
@Override 
protected void onPreExecute(){ 
    super.onPreExecute(); 
    mProgress = new ProgressDialog(yourContext); 
    mProgress.setMessage("Obtaining list of names from server..."); 
    mProgress.show();  
} 

@Override 
protected void onPostExecute(String result){ 
    super.onPostExecute(result); 
    mProgress.dismiss(); 
} 
+0

C'est ce que quelqu'un d'autre a répondu ... as cette question est un doublon ... pourquoi répondez-vous encore et encore à la question qui est un doublon? – Selvin

+0

Merci pour la réponse, mais ne fonctionne pas. Je reçois une exception, ajouté à la question après l'édition. – osanfer

+0

J'ai résolu le problème, getBaseContext() n'était pas un bon contexte pour le dialogue, changer par ClassName.this et de travailler. Merci beaucoup Bhuvi! – osanfer

0

Ajoutez ce code dans votre tâche asynchrone.

initialisation pour progressDialoge
ProgressDialog progressDialog; 

et ajoutez ce code est ajouter dans onPreExecute

progressDialog = ProgressDialog.show(Form.this, "", "Loading...", true,false); 

et dernier onPostExecute ajoutez ce code

if(progressDialog1!=null && progressDialog1.isShowing()){ 
      progressDialog1.dismiss(); 
      Log.e("DISMISS", "DISMISS"); 
     } 
0

Il suffit de faire ce ..

private ProgressDialog mDialog; 

@Override 
protected void onPreExecute(){  
    mDialog = new ProgressDialog(context); 
    mDialog.setMessage("loading..."); 
    mDialog.setIndeterminate(true); 
    mDialog.setCancelable(false); 
    mDialog.show();  
} 

@Override 
protected void onPostExecute(String result){ 
    mDialog.dismiss(); 
}