Autore Topic: Problema su ProgressDialog  (Letto 924 volte)

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Problema su ProgressDialog
« il: 20 Dicembre 2011, 12:11:13 CET »
0
Buongiorno a tutti, chiedo aiuto a voi perchè il mio software presenta un bug dal quale non sto riuscendo a venirne a capo.
L'errore che ho è un errore di runtime, ed il logcat è il seguente
Codice: [Seleziona]
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()Questo succede quando io richiamo una funzione che mi deve creare una progressdialog a video, il cui codice è questo
Codice (Java): [Seleziona]
private void getProgressDialogGps() {
                progressDialog = new ProgressDialog(FiestaActivity.this);
                progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                progressDialog.setMessage(getResources().getString(R.string.gpsDialog));
                progressDialog.setCancelable(false);
                if (!runnedSplash) {
                        Handler showProgressDialog = new Handler();
                        showProgressDialog.postDelayed(new Runnable() {
                               
                                public void run() {
                                        if (!getPosition)
                                                progressDialog.show();
                                }
                        }, SPLASHTIME);
                } else {
                        progressDialog.show();
               

La cosa che mi lascia perplesso è che l'errore non mi viene dato sempre ma solo quando lancio la funzione per aggiornare la posizione gps. Cioè nella mia applicazione ho definito un lasso di tempo (10 minuti) oltre il quale l'app deve aggiornare la sua posizione. Per fare questo uso la funzione initGps()

Codice (Java): [Seleziona]
private void initGps() {
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                Criteria criteria = new Criteria();
                String bestProvider = lm.getBestProvider(criteria, true);
                if (bestProvider != null) {
                        getProgressDialogGps();
                GpsListener gpsProviderListener = new GpsListener();
                lm.requestLocationUpdates(bestProvider, 60000, 20, gpsProviderListener);
                new GpsTimeout().execute();
                } else {
                        fixTime = System.currentTimeMillis();
                        getAlertDialogForGeolocation();
        }
    }

questo è il relativo listener

Codice (Java): [Seleziona]
private class GpsListener implements LocationListener {

                public void onLocationChanged(Location location) {
                        getPosition = true;
                        if (progressDialog != null) progressDialog.dismiss();
                        myPositionLat = location.getLatitude();
                        myPositionLng = location.getLongitude();
                       
                        String lat = String.valueOf(myPositionLat);
                        String lon = String.valueOf(myPositionLng);
                        fixTime = System.currentTimeMillis();
                       
                        getProgressDialogLoadingLista();
                        new PopolaLista(lat, lon).execute();
                        lm.removeUpdates(this);
                }

                public void onProviderDisabled(String provider) {
                        // TODO Auto-generated method stub
                       
                }

                public void onProviderEnabled(String provider) {
                        // TODO Auto-generated method stub
                       
                }

                public void onStatusChanged(String provider, int status, Bundle extras) {
                        // TODO Auto-generated method stub
                       
                }
               
        }

Tutta questa giostra viene lanciata da un item dell'optionMenu, che controlla il tempo dell'ultimo fix del gps e se è più vecchio di 10 minuti rilancia l'initGps(). In questo caso ho quell'errore di runtime sulla riga 1 della funzione getProgressDialogGps().

Scusate se mi sono dilungato molto, spero mi possiate aiutare perchè io non ne sto venendo veramente a capo :(

Offline BlackJad

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Google+
    • michele-ziparo/4/825/a99/
    • blackjad82
    • Mostra profilo
    • Datawit Systems
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    Michele Ziparo
  • Sistema operativo:
    Windows 8.1
Re:Problema su ProgressDialog
« Risposta #1 il: 21 Dicembre 2011, 11:49:47 CET »
0
Ciao, per aggiornare gli elementi della tua interfaccia grafica a partire da codice in esecuzione in un altro thread, puoi fare così:

All'interno del run richiama il metodo runOnUiThread passandogli un tipo Runnable come argomento

Codice (Java): [Seleziona]
Thread loadingThread = new Thread() {
                @Override
                public void run() {
                        try {
                                super.run();
                                       
                                runOnUiThread(aggiornaInterfaccia);
                                       
                        }
                        catch (Exception e) {

                        }
                }
        };
   loadingThread .start();

Poi aggiungi il Runnable

Codice (Java): [Seleziona]
private Runnable aggiornaInterfaccia = new Runnable() {
               
        public void run() {

                // Qua il codice per l'aggiornamento
        }
};

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:Problema su ProgressDialog
« Risposta #2 il: 21 Dicembre 2011, 12:14:03 CET »
0

Ciao, innanzitutto ti ringrazio per la risposta.
Premetto che ho risolto poco fa prima di leggere la tua risposta ma credo che il metodo sia simile.
In sostanza avevo 2 cose che mi davano problemi, uno era il lancio di una progressdialog da parte di un asynctask anche se il dialog era dichiarato e lanciato nel codice della activity ed il secondo problema era legato al locationmanager sempre perchè lanciato dall'asynctask.
Per risolvere mi sono creato 2 handler nel codice della activity e dall'asynctask mi limito a mandare messaggi a quegli handler (che poi credo sia la pratica più corretta, solo che è la mia prima app e tutti gli errori ed esperienza la sto facendo su lei poverina :) ). Negli handler poi vedo che messaggio mi è arrivato e faccio le dovute operazioni