Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Android: refresh della View prima di una chiamata httpConnection

    Sto cercando di trovare come si può costringere Android ad aggiornare la UI prima di una chiamata AsyncTask ma non riesco proprio.

    Ecco la parte di codice:

    codice:
            progresso = (ProgressBar) findViewById(R.id.progressBarLoading);
            progressAnimator = ObjectAnimator.ofFloat(progresso, "progress", 0,100);
            progressAnimator.setDuration(7000);
            progresso.setVisibility(progresso.VISIBLE);
            progressAnimator.start();
            getWindow().getDecorView().invalidate();
    
    
            httpConnection myasyn = new httpConnection();
    
    
            oroscopo.setText("Attendi grazie...");
            oroscopo.setVisibility(oroscopo.VISIBLE);
    
    
            try {
    
    
                myasyn.execute(Segno).get();
    
    
            } catch (Exception e) {
    
    
                    oroscopo.setText("Ooops. Si è verificato un problema. Riprova.");
    
    
            }
    Prima della chiamata myasyn vorrei vedere la barra, ma la UI non si aggiorna se non dopo la chiamata.
    Come debbo fare? E perché non si aggiorna quando chiamo il metodo invalidate() ??
    Non sei qui per fare una scelta, la scelta l'hai già fatta...Ora devi comprendere le ragioni per cui l'hai fatta. Non possiamo vedere oltre le scelte che non ci sono chiare. http://www.chicercatrova2000.it

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da prozac2000 Visualizza il messaggio
    Prima della chiamata myasyn vorrei vedere la barra, ma la UI non si aggiorna se non dopo la chiamata.
    Premetto che non sviluppo su Android (e me ne intendo poco in generale di Android). Però sto leggendo un attimo la documentazione di AsyncTask che mi pare molto chiara. Il execute ritorna praticamente immediatamente perché schedula solo il task su un thread di background.
    Ma tu poi fai subito il get che è "bloccante", perché attende la terminazione del task. Quindi il task gira effettivamente in background in un thread a parte ma tu stai anche bloccando e tenendo impegnato il UI thread, che quindi di certo non può aggiornare la interfaccia utente.

    Pertanto quello che ti posso dire è che come minimo devi cambiare approccio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premetto che non sviluppo su Android (e me ne intendo poco in generale di Android). Però sto leggendo un attimo la documentazione di AsyncTask che mi pare molto chiara. Il execute ritorna praticamente immediatamente perché schedula solo il task su un thread di background.
    Ma tu poi fai subito il get che è "bloccante", perché attende la terminazione del task. Quindi il task gira effettivamente in background in un thread a parte ma tu stai anche bloccando e tenendo impegnato il UI thread, che quindi di certo non può aggiornare la interfaccia utente.

    Pertanto quello che ti posso dire è che come minimo devi cambiare approccio.
    Quindi, come si può fare?
    Non sei qui per fare una scelta, la scelta l'hai già fatta...Ora devi comprendere le ragioni per cui l'hai fatta. Non possiamo vedere oltre le scelte che non ci sono chiare. http://www.chicercatrova2000.it

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da prozac2000 Visualizza il messaggio
    Quindi, come si può fare?
    Il punto è: perché vuoi fare il get()??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il punto è: perché vuoi fare il get()??
    Perché sono obbligato ad attendere che il task abbia terminato tutto lo scaricamento, altrimenti mi ritrovo sono una parte delle informazioni scaricate.
    Non sei qui per fare una scelta, la scelta l'hai già fatta...Ora devi comprendere le ragioni per cui l'hai fatta. Non possiamo vedere oltre le scelte che non ci sono chiare. http://www.chicercatrova2000.it

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da prozac2000 Visualizza il messaggio
    Perché sono obbligato ad attendere che il task abbia terminato tutto lo scaricamento, altrimenti mi ritrovo sono una parte delle informazioni scaricate.
    Ma così con il get() comunque non puoi, perché come detto stai bloccando il UI thread. Sempre dalla documentazione ufficiale, vedo che AsyncTask ha un onPostExecute(Result) che come è descritto: "invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter."

    Quindi puoi fare un override di questo onPostExecute per fare "qualcosa" (e nota: nel contesto del UI thread!) verso l'utente ... che so ... aggiornare una tabella .. riabilitare pulsanti .. mostrare una dialog box, ecc...
    Insomma è così che dovresti iniziare a ragionare. Secondo me devi solo comprendere bene il funzionamento e il "flusso" di esecuzione del AsyncTask.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma così con il get() comunque non puoi, perché come detto stai bloccando il UI thread. Sempre dalla documentazione ufficiale, vedo che AsyncTask ha un onPostExecute(Result) che come è descritto: "invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter."

    Quindi puoi fare un override di questo onPostExecute per fare "qualcosa" (e nota: nel contesto del UI thread!) verso l'utente ... che so ... aggiornare una tabella .. riabilitare pulsanti .. mostrare una dialog box, ecc...
    Insomma è così che dovresti iniziare a ragionare. Secondo me devi solo comprendere bene il funzionamento e il "flusso" di esecuzione del AsyncTask.
    Purtroppo non credo si possa fare l'override di onPostExecute. Forse dovrei implementare un metodo interface e fare l'override di quest'ultimo...
    Non sei qui per fare una scelta, la scelta l'hai già fatta...Ora devi comprendere le ragioni per cui l'hai fatta. Non possiamo vedere oltre le scelte che non ci sono chiare. http://www.chicercatrova2000.it

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da prozac2000 Visualizza il messaggio
    Purtroppo non credo si possa fare l'override di onPostExecute. Forse dovrei implementare un metodo interface e fare l'override di quest'ultimo...
    Eh? Ma che stai dicendo (?)

    AsyncTask è una classe che deve essere estesa per poter definire concretamente un task (AsyncTask è abstract). E estendendola è quindi possibile ridefinire (override) onPostExecute.

    Per cortesia, documentati.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Eh? Ma che stai dicendo (?)

    AsyncTask è una classe che deve essere estesa per poter definire concretamente un task (AsyncTask è abstract). E estendendola è quindi possibile ridefinire (override) onPostExecute.

    Per cortesia, documentati.
    boh!? Provo a fare l'override e vediamo se funziona... Poi ti faccio sapere...
    Non sei qui per fare una scelta, la scelta l'hai già fatta...Ora devi comprendere le ragioni per cui l'hai fatta. Non possiamo vedere oltre le scelte che non ci sono chiare. http://www.chicercatrova2000.it

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ecco un esempio di AsyncTask che scarica un file da un server remoto...

    codice:
        private class DwTask extends AsyncTask<String, Integer, String> {
            
            private static final String TAG = "NomeApp.class";
            private int fileLength;
            private Context ctx;
            private final ProgressDialog dialogUpdate;
            
            public DwTask(Context ctx, int fileLength) {
                this.ctx = ctx;
                this.fileLength = fileLength;
                dialogUpdate = new ProgressDialog( ctx );
            }
            
            @Override
            public void onPreExecute() {
                dialogUpdate.setMessage("Download file in progress...");
                dialogUpdate.setProgressStyle( ProgressDialog.STYLE_HORIZONTAL );
                dialogUpdate.setIndeterminate( false );
                dialogUpdate.setMax( 100 );
                dialogUpdate.setProgress(0);
                dialogUpdate.setCancelable( false );
                dialogUpdate.setCanceledOnTouchOutside( false );
                dialogUpdate.show();
            }
            
            @Override
            protected String doInBackground(String... fileUrl) {
                String localPath = Environment.getExternalStorageDirectory().getPath() + "/NomeApp/dwnldFile.txt";
                InputStream input = null;
                OutputStream output = null;
                try {
                    // Mi connetto al URL
                    URL url = new URL( fileUrl[0] );
                    URLConnection connection = url.openConnection();
                    connection.connect();
    
                    // Apro gli stream di input/output
                    input = url.openStream();
                    output = new FileOutputStream( localPath );
                    
                    // Scarico il file a blocchi di 1024 byte
                    byte data[] = new byte[1024];
                    int total = 0;
                    int count;
                    int lastProgress = 0;
                    while ((count = input.read(data)) != -1) {
                        output.write(data, 0, count);
                        output.flush();
                        total += count;
                        Integer byteProgress = (total * 100) / fileLength;
                        if (byteProgress != lastProgress) {
                            publishProgress( byteProgress );
                            lastProgress = byteProgress;
                        }
                    }
    
                    // Effettuo il flush
                    output.flush();
                } catch (Exception e) {
                    Log.e(TAG, "Error in download of file", e);
                } finally {
                    if (output != null) {
                        try { output.close(); } catch (Exception e) { }
                    }
                    if (input != null) {
                        try { input.close(); } catch (Exception e) { }
                    }
                }
                return localPath;
            }
            
            @Override
            protected void onProgressUpdate(Integer... values) {
                dialogUpdate.setProgress(values[0]);
                super.onProgressUpdate(values);
            }
            
            @Override
            protected void onPostExecute(String path) {
                dialogUpdate.dismiss();
            }
        }

    Come vedi, è stato fatto l'override di diversi metodi, tra i quali anche onPostExecute().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.