Autore Topic: ProgressDialog (caricamento...). Non si può modificare la View in DoInBackGround  (Letto 1342 volte)

Offline mauro21

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
ciao a tutti

ho un problema: ho un'app che disegna grafici e per elaborare i dati e salvare tutti i punti ci mette tipo 4 o 5 secondi

in questo intervallo vorrei visualizzare una finestrina con scritto tipo waiting...

Ho provato a usare la progressdialog ma mi da un errore dopo aver visualizzato la finestra di caricamento
ERRORE:

Codice: [Seleziona]

07-16 20:27:09.797: E/AndroidRuntime(11754): FATAL EXCEPTION: AsyncTask #1
07-16 20:27:09.797: E/AndroidRuntime(11754): java.lang.RuntimeException: An error occured while executing doInBackground()
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.lang.Thread.run(Thread.java:1096)
07-16 20:27:09.797: E/AndroidRuntime(11754): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.View.requestLayout(View.java:8125)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.ViewGroup.addView(ViewGroup.java:1863)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.ViewGroup.addView(ViewGroup.java:1822)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.view.ViewGroup.addView(ViewGroup.java:1802)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at com.example.tablayout.Graficas.GraficoTutteTemperature(Graficas.java:918)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at com.example.tablayout.Graficas$HttpGetTask.doInBackground(Graficas.java:944)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at com.example.tablayout.Graficas$HttpGetTask.doInBackground(Graficas.java:1)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-16 20:27:09.797: E/AndroidRuntime(11754):         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-16 20:27:09.797: E/AndroidRuntime(11754):         ... 4 more
07-16 20:27:11.767: E/WindowManager(11754): Activity com.example.tablayout.TabLayout has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f3b6b0 that was originally added here
07-16 20:27:11.767: E/WindowManager(11754): android.view.WindowLeaked: Activity com.example.tablayout.TabLayout has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f3b6b0 that was originally added here
07-16 20:27:11.767: E/WindowManager(11754):         at android.view.ViewRoot.<init>(ViewRoot.java:247)
07-16 20:27:11.767: E/WindowManager(11754):         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
07-16 20:27:11.767: E/WindowManager(11754):         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-16 20:27:11.767: E/WindowManager(11754):         at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-16 20:27:11.767: E/WindowManager(11754):         at android.app.Dialog.show(Dialog.java:241)
07-16 20:27:11.767: E/WindowManager(11754):         at android.app.ProgressDialog.show(ProgressDialog.java:107)
07-16 20:27:11.767: E/WindowManager(11754):         at android.app.ProgressDialog.show(ProgressDialog.java:95)
07-16 20:27:11.767: E/WindowManager(11754):         at com.example.tablayout.Graficas$6.onClick(Graficas.java:133)
07-16 20:27:11.767: E/WindowManager(11754):         at android.view.View.performClick(View.java:2408)
07-16 20:27:11.767: E/WindowManager(11754):         at android.view.View$PerformClick.run(View.java:8816)
07-16 20:27:11.767: E/WindowManager(11754):         at android.os.Handler.handleCallback(Handler.java:587)
07-16 20:27:11.767: E/WindowManager(11754):         at android.os.Handler.dispatchMessage(Handler.java:92)
07-16 20:27:11.767: E/WindowManager(11754):         at android.os.Looper.loop(Looper.java:123)
07-16 20:27:11.767: E/WindowManager(11754):         at android.app.ActivityThread.main(ActivityThread.java:4627)
07-16 20:27:11.767: E/WindowManager(11754):         at java.lang.reflect.Method.invokeNative(Native Method)
07-16 20:27:11.767: E/WindowManager(11754):         at java.lang.reflect.Method.invoke(Method.java:521)
07-16 20:27:11.767: E/WindowManager(11754):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-16 20:27:11.767: E/WindowManager(11754):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-16 20:27:11.767: E/WindowManager(11754):         at dalvik.system.NativeStart.main(Native Method)
07-16 20:27:12.537: I/Process(11754): Sending signal. PID: 11754 SIG: 9

come posso fare?
P.S. ho preso pezzi di codice da esempi su questo forum e  su internet, quindi può darsi che ci siano errori anche per questo

allego pezzi di codice

Codice: [Seleziona]
Button jBtnCrea3 = (Button) this.findViewById(R.id.button3);
                jBtnCrea3.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                               
                                //barra caricamento di 6 secondi, solo che inizia quando inizia il grafico!!
                               
                                 pd = ProgressDialog.show(Graficas.this,"Creando il grafico","Connecting...",true,false);
                            // creo e avvio asynctask
                            HttpGetTask task = new HttpGetTask();
                           task.execute("ciao");
                           


                               

                        }
                });

Codice: [Seleziona]
private class HttpGetTask extends AsyncTask<String,String,String>  {

              @Override
              protected String doInBackground(String... params) {

                 String result = null;
                 
               
                   
                    // aggiorno la progress dialog
                    publishProgress("Attendere prego");
                   
                   //QUESTO È IL METODO CHE CI METTE SECOLI!!!
                                GraficoTutteTemperature();
                   
                   
                   
                   
                 
                 return result;
                 
              }

              @Override
              protected void onProgressUpdate(String... values) {
                 // aggiorno la progress dialog
                 pd.setMessage(values[0]);
              }

              @Override
              protected void onPostExecute(String result) {
                 // chiudo la progress dialog
                 pd.dismiss();
             

              }
           }

GRAZIE 1000
« Ultima modifica: 17 Luglio 2012, 12:22:20 CEST da mauro21 »

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:Problema ProgressDialog (caricamento...)
« Risposta #1 il: 16 Luglio 2012, 23:07:58 CEST »
0
Io di solito istanzio la PD in onPreExecute, in do in background faccio il lavoro sporco, in onPostExecute la chiudo...senza quell'aggiornamento in background che secondo me crea problemi...

Offline mauro21

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
Re:Problema ProgressDialog (caricamento...)
« Risposta #2 il: 17 Luglio 2012, 00:01:41 CEST »
0
ho provato a fare cosi come dici te

Codice: [Seleziona]
private class HttpGetTask extends AsyncTask<String,String,String>  {

        @Override
        protected String doInBackground(String... params) {

               
         
             
              // aggiorno la progress dialog
              publishProgress("Attendere prego");
             
             //QUESTO È IL METODO CHE CI METTE SECOLI!!!
                          GraficoTutteTemperature();
             
             
           
           return null;
           
        }
/*
        @Override
        protected void onProgressUpdate(String... values) {
            aggiorno la progress dialog
           pd.setMessage(values[0]);
        }*/
        @Override
        protected void onPreExecute() {
            pd = ProgressDialog.show(Graficas.this,"Creando il grafico","Attendere prego",true,false);

        }
   
        @Override
        protected void onPostExecute(String result) {
           // chiudo la progress dialog
           pd.dismiss();
       

        }
     }

però Esce la finestrella progressdialog e passati i 4-5 secondi, quando dovrebbe visualizzare il grafico, da l'errore di prima..


(può essere che la chiave si trovi qui??)
07-16 23:59:34.494: E/AndroidRuntime(314): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

grazie 1000 x il tuo aiuto

Offline mauro21

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
Re:Problema ProgressDialog (caricamento...)
« Risposta #3 il: 17 Luglio 2012, 00:34:14 CEST »
0
per maggior chiarezza allego anche il codice del metodo "lentissimo"

Codice: [Seleziona]
public void GraficoTutteTemperature(){
               
               
               
               
                LinearLayout layout = (LinearLayout) findViewById(R.id.graph1);

                // PULISCI ZONA GRAFICI
                layout.removeAllViewsInLayout();

               
                List<Double> ejey1 = new ArrayList<Double>();
                List<Integer> ejex1 = new ArrayList<Integer>();
                List<Integer> supp = new ArrayList<Integer>();
                List<String> date = new ArrayList<String>();
               

                List<GraphViewSeries> serie = new ArrayList<GraphViewSeries>();
               
                int colori[] = { -65281, -16711936, -3355444, -65536, -1, -256 };
               
                int dimetem=0;
                String pre="";
               
                //analizzo il file: prendo le date e le salvo in date (senza doppioni) e riempio le liste x
                // i grafici sulla temperatura
                try {
                        File ruta_sd = Environment.getExternalStorageDirectory();

                        File f = new File(ruta_sd.getAbsolutePath(),
                                        "temperatura_solo_datos.txt");

                        BufferedReader fin = new BufferedReader(
                                        new InputStreamReader(new FileInputStream(f)));
                        int dia=0;
                        while (true) {
                                String due = fin.readLine();
                                if (due == null)
                                        break;
                                else {                                                                                                       
                                                                                               
                                        String datafile = "" + due.charAt(1)
                                                        + due.charAt(2) + "-" + due.charAt(4)
                                                        + due.charAt(5) + "-" + due.charAt(7)
                                                        + due.charAt(8) + due.charAt(9)
                                                        + due.charAt(10);
                               
                                               
                                        if(dimetem==0)
                                                date.add(datafile);
                                        else if(!pre.equals(datafile)&&dimetem!=0){
                                                        date.add(datafile);
                                                        dia+=24*60;}
                                       
                                       
                                        int ora = dia
                                                        + (60 * Integer.parseInt(""
                                                                        + due.charAt(13) + due.charAt(14)) + Integer
                                                                                .parseInt("" + due.charAt(16)
                                                                                                + due.charAt(17)));
                                        ejex1.add(ora);
                                        double temp = Double.parseDouble(""
                                                        + due.charAt(21) + due.charAt(22) + "."
                                                        + due.charAt(24));
                                        ejey1.add(temp);
                                       
                                       
                               
                                        pre=datafile;
                                        dimetem++;
                                       
                        }
                               
                        }
                       
                        fin.close();
                       
                }       
               
               
               
                catch (Exception ex) {

                        //Toast.makeText(getApplicationContext(),
                                //        getString(R.string.nosd), Toast.LENGTH_LONG).show();
                       
                }
                               
/////INIZIO CREAZIONE GRAFICI EVENTI               
               
               
               
               
               
                for (int x = 0; x < stri.size(); x++) {

                       
                        int giorno = 0;
                        int contr=0;
                       
                       
                       
                        supp.clear();
                       
                        for (int i = 0; i < (24*60)*(date.size()); i++)
                        supp.add(i, 26);
                       
                        for(int q=0;q<date.size();q++){
       
                                               
                                               
                                                String datafile = date.get(q);


                                                if (q>0)
                                                        giorno += 60 * 24;
                               
                                                        for (int j = 0; j < lista.size(); j++) {

                                                                if (datafile.equals(lista.get(j)
                                                                                .getData())
                                                                                && lista.get(j)
                                                                                                .getNome()
                                                                                                .equals(stri.get(x))) {

                                                                        // DATA NEL FORMATO MINUTI
                                                                        contr = 1;
                                                                        int inizio = giorno
                                                                                        + (60 * Integer
                                                                                                        .parseInt(""
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getInizio()
                                                                                                                                        .charAt(0)
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getInizio()
                                                                                                                                        .charAt(1)) + Integer
                                                                                                        .parseInt(""
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getInizio()
                                                                                                                                        .charAt(3)
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getInizio()
                                                                                                                                        .charAt(4)));
                                                                        int fine = giorno
                                                                                        + (60 * Integer
                                                                                                        .parseInt(""
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getFine()
                                                                                                                                        .charAt(0)
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getFine()
                                                                                                                                        .charAt(1)) + Integer
                                                                                                        .parseInt(""
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getFine()
                                                                                                                                        .charAt(3)
                                                                                                                        + lista.get(
                                                                                                                                        j)
                                                                                                                                        .getFine()
                                                                                                                                        .charAt(4)));


                                                                                for (int i = inizio; i < fine; i++)
                                                                                        supp.add(i, 40);

                                                                       
                                                                }}
                                                       
                                               
                       
                        }
                       
                       
                        if (contr!=0){

                       
                        GraphViewData[] dati = new GraphViewData[supp.size()];
                        for (int i = 0; i < dati.length; i++)               
                                    dati[i] = new GraphViewData(i, supp.get(i));
                       
                        serie.add(new GraphViewSeries(stri
                                        .get(x),
                                        new GraphViewStyle(
                                                        colori[x % 6], 3),
                                        dati));
                       
                        }
                       
                       
                }
               
               
        /////FINE CREAZIONE GRAFICI EVENTI       
               

                // SE CI SONO DATI...
                if (!date.isEmpty()) {

                        dimetem--;
                        GraphViewData[] memo = new GraphViewData[dimetem];
                        GraphViewData[] memomovil = new GraphViewData[dimetem];

                        // CALCOLO MEDIA MOVIL!!!!!!!!!
                        List<Double> ejey2 = new ArrayList<Double>();
                        int x1 = Integer.parseInt(te.getText().toString());

                        Mediamovil med = new Mediamovil();
                        ejey2 = med.returnMediamovil(ejey1, x1);

                        // QUI INSERISCO I PUNTI DEL GRAFICO TEMPERATURE
                        for (int k = 0; k < dimetem; k++)
                                memo[k] = new GraphViewData(ejex1.get(k), ejey1.get(k));

                        for (int k = 0; k < dimetem; k++)
                                memomovil[k] = new GraphViewData(ejex1.get(k), ejey2
                                                .get(k));

                        // GESTIONE ASSE DELLE X CON ORARI 04:30 INVECE CHE NUMERI
                        // 270

                        LineGraphView graphView = new LineGraphView(
                                        getApplicationContext(), getString(R.string.tempda)
                                                        + " " + date.get(0) + " "
                                                        + getString(R.string.tempal) + " "
                                                        + date.get(date.size()-1)) {
                                @Override
                                protected String formatLabel(double value,
                                                boolean isValueX) {
                                        if (isValueX)
                                                return returnnull2(value);

                                        else
                                                return super.formatLabel(value, isValueX); // let
                                                                                                                                        // the
                                                                                                                                        // y-value
                                                                                                                                        // be
                                                                                                                                        // normal-formatted
                                }
                        };

                        GraphViewSeries exampleSeries1 = new GraphViewSeries(
                                        getString(R.string.temp), new GraphViewStyle(
                                                        Color.BLUE, 3), memo);
                        GraphViewSeries exampleSeries2 = new GraphViewSeries(
                                        getString(R.string.tempmm), new GraphViewStyle(
                                                        Color.CYAN, 3), memomovil);

                        graphView.addSeries(exampleSeries1);
                        graphView.addSeries(exampleSeries2);

                        for (int i = 0; i < serie.size(); i++)
                                graphView.addSeries(serie.get(i));

                        graphView.setShowLegend(true);
                        graphView.setLegendAlign(LegendAlign.BOTTOM);
                        graphView.setLegendWidth(170);

                        graphView.setScrollable(true);
                        graphView.setViewPort(0, 360);
                        // VALORI SULLE X FISSI (ESSENDO STRING, SONO A DISTANZA
                        // FISSA)
                        // graphView.setHorizontalLabels(new String[]
                        // {"00:00","01:00","02:00","03:00","04:00", "05.00",
                        // "06:00","07:00","08:00","09:00","10.00","11:00","12:00","13:00","14:00","15.00","16.00","17.00","18.00","19.00","20.00","21.00","22.00","23.00","24.00",});
                        layout.addView(graphView);

                } else {
                        Toast.makeText(getApplicationContext(),
                                        getString(R.string.notemp), Toast.LENGTH_LONG)
                                        .show();

                }
               
               
               
               
               
        }

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
R: Problema ProgressDialog (caricamento...)
« Risposta #4 il: 17 Luglio 2012, 09:14:14 CEST »
0
Prova
Codice: [Seleziona]
try {
pd.dismiss()
}
catch (Exception e) {}
 

Mi pare poi di ricordare che in doInBackground non puoi modificare la view aggiungendo layout e quant'altro...devi passarti il tutto a onPostExecute.

Inviato dal mio GT-I9100 con Tapatalk 2
« Ultima modifica: 17 Luglio 2012, 09:27:28 CEST da Melanogaster »

Offline mauro21

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
Re:Problema ProgressDialog (caricamento...)
« Risposta #5 il: 17 Luglio 2012, 12:20:26 CEST »
0
Si il problema principale è proprio questo!!! In doInBackground non si può modificare la View!!
ho quindi messo i comandi
LinearLayout layout = (LinearLayout) findViewById(R.id.graph1);
layout.removeAllViewsInLayout();
e
layout.addView(graphView);

nella postExecute().

Inoltre ho aggiunto
protected void onProgressUpdate(String... values) {
// aggiorno la progress dialog
pd.setMessage(values[0]);
}

Per poter scrivere durante l'esecuzione del codice in doinbackground dei messaggi con
publishProgress("ciao")
(equivale, se il progressdialog fosse horizontal, a setvalue(int))

grazie 1000 a tutti!!