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.

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.

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.

  • Google Android de inicio de sesión está parpadeando un pequeño cuadro blanco vacío al iniciar sesión en un usuario
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.