L'attività di Android ASync ProgressDialog non viene mostrata finché il thread di background non finisce

Ho un'attività Android che prende un feed RSS da un URL e utilizza il parser di SAX per attaccare each elemento dall'XML in un arrays. Tutto questo funziona bene, ma, come previsto, richiede un po 'di tempo, quindi voglio utilizzare AsyncActivity per farlo in background. Il mio codice è il seguente:

class AddTask extends AsyncTask<Void, Item, Void> { protected void onPreExecute() { pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true); } protected Void doInBackground(Void... unused) { items = parser.getItems(); for (Item it : items) { publishProgress(it); } return(null); } protected void onProgressUpdate(Item... item) { adapter.add(item[0]); } protected void onPostExecute(Void unused) { pDialog.dismiss(); } } 

Quello che chiamo con onCreate()

  • Come submit la posizione del dispositivo sul server quando necessario
  • Non so come risolvere (android.os.networkonmainthreadexception)
  • Come posso rilevare quando un'applicazione Android è in esecuzione nell'emulatore?
  • ListView paging in android
  • Gli annunci di YouTube non vengono mai mostrati durante l'utilizzo di API YouTube Player Android
  • Come impostare in modo programmatic l'attributo layout_align_parent_right di un button nel layout relativo?
  •  new AddTask().execute(); 

    Le items = parser.getItems() row items = parser.getItems() funzionano bene – gli items sono gli arrays che contengono each elemento dall'XML. Il problema che sto affrontando è che all'avvio dell'attività, il ProgressDialog che creo in onPreExecute() non viene visualizzato finché il metodo doInBackground() è terminato. cioè ho uno schermo nero, una lunga pausa, poi una list completamente popolata con le voci in. Perché questo accade? Perché non è il disegno dell'interface utente, la visualizzazione di ProgressDialog, il parser che ottiene gli elementi e li aggiunge progressivamente all'elenco, quindi il ProgressDialog ha licenziato?

  • Come impostare la dimensione dell'image?
  • Come get Chrome History & Bookmarks in Android Marshmallow (API> = 23)?
  • CollapsingToolbarLayout setTitle () non funziona più
  • È questo un dialogo o un'attività?
  • Come mostrare un button alla fine di un Android ListView
  • Java / Android HttpURLConnection setChunkedStreamingMode non funziona con tutti i server PHP
  • 4 Solutions collect form web for “L'attività di Android ASync ProgressDialog non viene mostrata finché il thread di background non finisce”

    Questo funziona per me

     @Override protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } 

    Sospetto che qualcosa sta bloccando il thread UI dopo aver eseguito l'operazione. Ad esempio, ho visto gente fare cose come questa:

     MyTask myTask = new MyTask(); TaskParams params = new TaskParams(); myTask.execute(params); myTask.get(5000, TimeUnit.MILLISECONDS); 

    L'invocazione invita qui blocca il thread dell'interface utente (che presumibilmente sta spinning l'attività qui …) che impedirà qualsiasi roba correlata all'interface utente nel metodo onPreExecute () del tuo task finché l'attività non finisce. Ops! Spero che questo ti aiuti.

    È perché hai usato AsyncTask.get() che blocca il thread UI "Attende se necessario per completare il calcolo e quindi recupera il suo risultato".

    Il modo giusto per farlo è passare l'istanza Activity al tuo AsyncTask da parte del constructor e finire quello che vuoi fare in AsyncTask.onPostExecution() .

    Se si sovrappone l'AsyncTask nell'attività corrente, è ansible utilizzare il metodo onPostExecute per assegnare il risultato del lavoro di background a un membro della class di chiamata.

    Il risultato viene passato come parametro in questo metodo, se specificato come terzo tipo generico.

    In questo modo, la tua interface utente non sarà bloccata come sopra indicato. Dovete prendervi cura di each successivo utilizzo del risultato al di fuori della sottoclass, poiché il thread di background potrebbe ancora essere in esecuzione e il tuo membro non avrebbe il nuovo valore.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.