2016-05-19 5 views
0

Я пытаюсь показать ProgressDialog, когда список загружает данные в AsyncTask, но «exito» в onPostExecute никогда не является истинным, и диалог никогда не увольняется. Я попытался удалить if (exito), но progressDialog уволит, и список будет снят через несколько секунд, и это не я хочу. Я хочу, чтобы прогресс progressDialog показывался во время загрузки, а когда он загружен, отмените фрагмент progressDialog и change.android - doInBackground return always false

Где моя ошибка? Благодаря

private class ATCargarProductos extends AsyncTask<Void, Integer, Boolean>{ 

     boolean terminado = false; 
     Bundle bdl; 
     FragmentTransaction transaction; 
     ProgressDialog progressDialog; 
     ArrayList<ItemDetails> results = new ArrayList<ItemDetails>(); 

     public ATCargarProductos(FragmentTransaction transaction){ 
      this.transaction = transaction; 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      if (compruebaConexion()) { 

       rellenaLista(new CallBack() { 
        @Override 
        public void onSuccess(final ArrayList<Comida> listaComidas) { 
         for (int i = 0; i < listaComidas.size(); i++) { 
          ItemDetails item_details = new ItemDetails(listaComidas.get(i)); 
          if (item_details.getTipo().equals("B")) { 

           results.add(item_details); 
          } 
         } 

         Fragment fragmentProductos = new FragmentProductos(); 
         bdl = new Bundle(2); 
         bdl.putInt("tipoProducto", 1); 
         bdl.putParcelableArrayList("resultados", results); 
         fragmentProductos.setArguments(bdl); 

         completado = true; 

        } 

        @Override 
        public void onFail(String msg) { 

        } 
       }); 

       return completado; 

      } else { 
       return false; 
      } 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      progressDialog = new ProgressDialog(getActivity(), R.style.AppTheme_Dark_Dialog); 
      progressDialog.setIndeterminate(true); 
      progressDialog.setMessage("Cargando lista..."); 
      progressDialog.show(); 
     } 

     @Override 
     protected void onPostExecute(Boolean exito) { 
      super.onPostExecute(exito); 
      if (exito) { 
       progressDialog.dismiss(); 
       transaction.commit(); 
      } 
     } 
    } 
+0

ли 'compruebaConexion' когда-нибудь правда? Вызывается ли исключение, которое предотвращает установку «completado» в true? (поставить try/catch в onSuccess). –

+0

Да, это правда. Этот метод проверяет только доступ к Интернету. – cnbandicoot

ответ

2

rellenaLista() является асинхронным.

Поскольку он работает в другом потоке, return completado; выполняется, прежде чем достичь onSuccess(), и поэтому completado еще false.

Вам не нужен AsyncTask.

Вы можете сделать следующее:

if (compruebaConexion()) { 
    // show progress dialog here 

    rellenaLista(new CallBack() { 
     @Override 
     public void onSuccess(final ArrayList<Comida> listaComidas) { 
      // dismiss dialog 
      // handle success 
     } 

     @Override 
     public void onFail(String msg) { 
      // dismiss dialog 
      // handle failure 
     } 
    }); 
} 
+0

Большое вам спасибо, вы поможете мне продолжить мой проект. :) – cnbandicoot

0

Я думаю, что метод compruebaConexion() всегда ложно, если вы можете добавить к вопросу код этого метода. Я мог бы признать эту идею.

+0

Это не ложь, потому что я проверяю его при отладке. Этот метод проверяет только, имеете ли вы доступ к Интернету, и если у вас есть Wi-Fi или 3G, этот метод всегда возвращает true – cnbandicoot

+0

Измените 'return completado;' на 'true ', чтобы проверить. –

+0

> Я попытался удалить if (exito), но progressDialog уволит, и список будет заряжен через несколько секунд, и я этого не хочу. Это то же самое, что – cnbandicoot

0

Создать класс, как это. И проверьте ваше подключение .

public class EZInternetConnection { 
    public static boolean isNetworkConnected(Context context) 
    { 
    ConnectivityManager cm = 
      (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     boolean flag = cm.getActiveNetworkInfo() != null && 
      cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
     return flag; 
    } 
} 

Использование:

if(EZInternetConnection.isNetworkConnected(context)) 
{ 
     //internet connection is ok. 
     //other codes. 

} 
else 
{ 
     //no internet. 
}