Android – progressdialog no se muestra en AsyncTask
Tengo una aplicación de Android que estoy teniendo problemas con.
Básicamente, el ProgressDialog
no se muestra en absoluto. Creo que esto es un problema de hilos de algún tipo, pero no sé cómo solucionarlo.
- Android ProgressDialog no funcionará
- ¿Cómo expirar Asynctask y descartar ProgressDialog?
- Cómo establecer el tema para ProgressBar indeterminista en ProgressDialog en Android
- Cómo mostrar un diálogo de progreso mientras se carga la página HTML en WebView
- No se puede descartar ProgressDialog después de completar el AsyncTask
Estoy utilizando ActionBarSherlock
con algunos Fragments
. También estoy usando el nuevo Android DrawerLayout
donde tengo mis opciones en el cajón, que reemplazan un fragmento cuando se hace clic.
En la primera carga de mi aplicación, quiero comprobar la base de datos para ver si los datos iniciales se ha descargado. Si no, entonces me voy y comenzar un AsyncTask
para descargar los datos. Esto DEBE tener una pantalla ProgressDialog
durante este, pero no.
¿Puede alguien ver a dónde me equivoco? Gracias.
MainScreen – La página / fragmento de destino predeterminado cuando se abre la aplicación
public class MainScreen extends SherlockFragment { public static final String TAG = "MainScreen"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.activity_main, container, false); setHasOptionsMenu(false); ImageView imgLogo = (ImageView) rootView.findViewById(R.id.imgMainScreen); imgLogo.setOnClickListener(new ButtonHandler(getActivity())); checkDatabase(); return rootView; } private void checkDatabase() { //Ensure there is data in the database DBHelper db = new DBHelper(this.getSherlockActivity()); db.checkDatabase(); } ... }
DBHelper.checkDatabase () – El método que inicia la descarga
public void checkDatabase() { if (isEmpty()) { //Connect to net and download data NetworkManager nm = new NetworkManager(activity); if (!nm.downloadData()) { Toast.makeText(activity, R.string.internetCheck, Toast.LENGTH_SHORT).show(); } } }
Y finalmente NetworkManager.downloadData () – El método que arranca el AsyncTask
:
public boolean downloadData() { try { return new HttpConnection(activity).execute().get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return false; } public class HttpConnection extends AsyncTask<Void, Void, Boolean> { private ProgressDialog progressDialog; private Activity m_activity; protected HttpConnection(Activity activity) { m_activity = activity; } @Override protected void onPreExecute() { progressDialog = new ProgressDialog(m_activity); progressDialog.setMessage("Wait ..."); progressDialog.setCancelable(false); progressDialog.setMax(100); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.show(); super.onPreExecute(); } @Override protected Boolean doInBackground(Void... params) { String[] types = new String[]{"type1", "type2", "type3", "type4", }; StringBuilder sb = new StringBuilder(); for(String type : types) { sb = new StringBuilder(); if(DBHelper.TYPE4_TABLE.equals(type)) { InputStream is = activity.getResources().openRawResource(R.raw.dbdata); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); try { sb.append(reader.readLine()); } catch (IOException e) { Toast.makeText(activity.getApplicationContext(), "Error retriveving data", Toast.LENGTH_SHORT).show(); Log.e(Constants.TAG, "Error reading data"); e.printStackTrace(); } } else { sb = fetchURLData(Constants.ALL_URL+type); } cleanDataAndStore(sb, type); } return true; } @Override protected void onPostExecute(Boolean result){ progressDialog.hide(); } }
Usando el código anterior, todo lo que obtengo es una pantalla en blanco como la aplicación intenta cargar, ya veces una ANR. Cuando se realiza la descarga, se carga el fragmento. Así que funciona bien, excepto para el ProgressDialog
falta.
PS, aviso Estoy estableciendo la activity
en cada constructor.
Gracias.
- ProgressDialog o ProgressBar ralentiza la aplicación que ejecuta Android 4.1
- Agregar una barra de progreso en WebView
- Despido de ProgressDialog en android
- El diálogo de carga de la vista Web de Android no se ha descartado
- Problema al mostrar ProgressDialog dentro de la actividad de la ficha anidada
- ¿Cómo crear Progress Dialog en la aplicación Android?
- Cómo cambiar el tamaño de fuente de mensaje ProgressDialog en android mediante programación?
- AsyncTask clase externa con ProgressDialog
Eliminar .get()
de return new HttpConnection(activity).execute().get();
Usted está básicamente bloqueando su hilo de interfaz de usuario. Una vez eliminado debe funcionar como AsyncTasks se espera que funcione.
El propósito es ser asíncrono, de modo que boolean downloadData()
debería tener un tipo de retorno de void
. Si necesitas hacer algo con los datos, debes implementar una interfaz "listener" y pasarla a AsyncTask.
Ejemplo de escucha:
class TaskConnect extends AsyncTask<Void, Void, ConnectionResponse> { private final AsyncTaskListener mListener; /** * */ public TaskConnect(AsyncTaskListener listener) { ... mListener = listener; } @Override protected void onPreExecute() { if (mListener != null) { mListener.onPreExecute(mId); } } @Override protected ConnectionResponse doInBackground(Void... cData) { ... return responseData; } @Override protected void onPostExecute(ConnectionResponse response) { if (mListener != null) { mListener.onComplete(response); } else { LOG.w("No AsyncTaskListener!", new Throwable()); } } } public interface AsyncTaskListener { public abstract void onPreExecute(int id); public abstract void onComplete(ConnectionResponse response); }
Mi problema no era el problema común de otros donde estaban llamando método get () después de ejecutar (). Mi problema era el contexto que estaba pasando a mi método AsyncTask. Tengo un settingsActivity y tengo un ReadMeActivity que llama la tarea del asynctask. En lugar de usar el contexto en el que se estaba llamando (ReadMeActivity.this) utilicé la configuraciónActividad que impidió su visualización. Una vez que lo cambié y lo pasé el contexto en el cual se estaba llamando la actividad funcionó.
Espero que ayude a alguien más.
- Cómo obtener fragmentos para ver correctamente
- Las solicitudes de recibo de entrega no funcionan para XMPP Android (aSmack)