2015-11-03 20 views
6

ho questa classe che viene chiamato da un frammento. L'aggiornamento sullo stato viene chiamato ma il messaggio non verrà aggiornato. Inoltre non vedo alcuna barra di avanzamento o spinner. Solo il titolo e il messaggio, visto alcuni problemi simili ma nulla in cui la barra di avanzamento non viene visualizzata affatto. Inoltre, il mio messaggio non si aggiornerà affatto su onProgressUpdate ma la stampa dei valori mostra che si incrementa all'interno di onProgressUpdate.finestra di avanzamento mostra, ma non mostra l'avanzamento Bar e messaggio non sta aggiornando

Edit: Ecco come mi metto il compito

DownloadFilesTask download = new DownloadFilesTask(); 
download.execute(urls.toArray(new String[urls.size()])); 

Ecco la classe

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> { 

ProgressDialog progressDialog; 

@Override 
protected void onPreExecute() 
{ 
    progressDialog = ProgressDialog.show(getActivity(), "Downloading","Downloaded 0/"+urls.size(), false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

@Override 
protected Long doInBackground(String[] urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
      //Do things in background here 
      publishProgress(new Integer[] {i}); 
    } 
    return totalSize; 
} 

@Override 
protected void onProgressUpdate(final Integer... progress) { 
    System.out.println(progress[0]); //This does print correctly 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      progressDialog.setProgress(progress[0]); 
      progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); 
     } 
    }); 
} 

@Override 
protected void onPostExecute(Long result) { 
    progressDialog.dismiss(); 
    Toast t = Toast.makeText(getActivity(), "Downloaded", Toast.LENGTH_LONG); 
    t.show(); 
} 

}

+1

Come hai iniziato l'attività, si prega di mostrare il codice. – starkshang

+0

A cura per mostrare il modo in cui lo inizio, il suo solo il modo generico si avvia un compito così è per questo non ho incluso esso. Questo aiuta affatto? – Zach

risposta

3

il problema riguarda il modo in cui il ProgressDialog è inizializzato.

Sostituisci il tuo OnPreExecute con questo:

@Override 
protected void onPreExecute() { 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setTitle("Downloading"); 
    progressDialog.setMessage("Downloaded 0/" + urls.size()); 
    progressDialog.setIndeterminate(false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progressDialog.show(); 
} 

In sostanza, è necessario chiamare prima di chiamare setProgressStyle spettacolo.

Inoltre, è possibile rimuovere il codice runOnUiThread in onProgressUpdate perché onProgressUpdate viene richiamato sul thread dell'interfaccia utente.

+0

Wow, una questione così semplice. Grazie mille, assegnerò taglie quando posso ~ 22 ore a sinistra – Zach

+1

Felice di aiutare - è un bug insidioso. Se sei interessato, dai un'occhiata alla sorgente ProgressDialog - vedrai perché ti sei imbattuto in questo problema. https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 – Aaron

0

Non sono sicuro della causa esatta, ma non è tenuto a setProgress su runnable come onProgressUpdate verrà eseguito sul thread dell'interfaccia utente.

provare a sostituire

getActivity().runOnUiThread(new Runnable() { @Override public void run() { progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); } });

con

progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size());

Inoltre - Stai facendo networking roba in doInbackground(), altrimenti non possiamo vedere i progressi che sarà respinto il onPostExecute().

+0

In realtà l'avevo già fatto ma non funzionava, quindi ho deciso di provare il runonuithread. Sto scaricando le immagini quindi sì, ci vuole un po '. La finestra di dialogo mostra ma non vi è alcuna barra di avanzamento, solo il titolo. Una volta finito di scaricare le immagini si chiude bene – Zach

+0

Ok. Può essere provare l'inizializzazione del dialogo prima progresso e chiamano la 'show()' in seguito alla fine del 'OnPreExecute()' – sha