Autore Topic: problema parsing con ProgressBarAsync  (Letto 872 volte)

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
problema parsing con ProgressBarAsync
« il: 04 Novembre 2013, 09:27:43 CET »
0
Salve a tutti Devs! Ho un problema con un Asynctask! L'applicazione fa il parsing di un file XML. Il file è molto grande e consuma memoria, così ho previsto un caricatore asincrono del metodo che fa il parsing (parseXML) che, però, rimane congelato e non va avanti...  dove sbaglio? Grazie per vostro prezioso contributo!

Codice (Java): [Seleziona]
...

public class MainActivity extends Activity {
        private int mProgressStatus = 0;
        private ProgressDialog mProgressDialog ;
        private ProgressBarAsync mProgressbarAsync;
        private boolean isPaginaPrincipale = true;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);  
                initFonts();
               
                mProgressDialog = new ProgressDialog(this);
                mProgressDialog.setCancelable(false);
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                mProgressDialog.setMessage("Caricamento dati in corso...");
                mProgressDialog.show();
                mProgressbarAsync = new ProgressBarAsync();
                mProgressbarAsync.execute();
        }

        private void initFonts(){
                TextView txt = (TextView) findViewById(R.id.textView1);
                Typeface font = Typeface.createFromAsset(getAssets(), "fonts/TrajanPro-Regular.ttf");  
                txt.setTypeface(font);  
        }
        private class ProgressBarAsync extends AsyncTask<Void, Integer, Void>{

/** This callback method is invoked, before starting the background process */
                @Override
                protected void onPreExecute() {
                        super.onPreExecute();
                        mProgressStatus = 0;
                }

/** This callback method is invoked on calling execute() method on an instance of this class */
                @Override
                protected Void doInBackground(Void...params) {
                        while(mProgressStatus<100){

                                try{
                                mProgressStatus++;
                                publishProgress(mProgressStatus);
                         
                                parseXML();
                           
                                }catch(Exception e){
                                        Log.d("Exception", e.toString());
                                }
                        }
                        return null;
                }

/** This callback method is invoked when publishProgress() method is called */
           
                @Override
                protected void onProgressUpdate(Integer... values) {
                    super.onProgressUpdate(values);
                    mProgressDialog.setProgress(mProgressStatus);
                }

 /** This callback method is invoked when the background function doInBackground() is executed completely */
                @Override
                protected void onPostExecute(Void result) {
                        super.onPostExecute(result);
                        mProgressDialog.dismiss();
                }
        }


        private void parseXML() {
                AssetManager assetManager = getBaseContext().getAssets();
                try {

                        InputStream is = assetManager.open("xml/asili.xml");
                        SAXParserFactory spf = SAXParserFactory.newInstance();
                        SAXParser sp = spf.newSAXParser();
                        XMLReader xr = sp.getXMLReader();
                        OrderXMLHandler myXMLHandler = new OrderXMLHandler();
                        xr.setContentHandler(myXMLHandler);
                        InputSource inStream = new InputSource(is);
                        xr.parse(inStream);

                        LinearLayout ll = (LinearLayout)findViewById(R.id.LinearLayout);
                        TextView tv = new TextView(this);
                        tv = new TextView(this);

                        ArrayList<ProductInfo> cartList = myXMLHandler.getCartList();
                        for(ProductInfo productInfo: cartList){
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Municipio : " + productInfo.getcampo1());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Tipo : " + productInfo.getcampo2());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Natura giuridica : " + productInfo.getcampo3());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Nome : " + productInfo.getcampo4());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Indirizzo : " + productInfo.getcampo5());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Telefono : " + productInfo.getcampo6());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Orario entrata/uscita : " + productInfo.getcampo7());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Corsi attivi : " + productInfo.getcampo8());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Totale iscritti : " + productInfo.getcampo9());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Iscritti maschi : " + productInfo.getcampo10());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);                
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText("Iscritti femmine : " + productInfo.getcampo11());
                                tv.setTextColor(Color.parseColor("#FFFFFF"));
                                ll.addView(tv);
                                //-------------------------------------------------------------
                                tv = new TextView(this);
                                tv.setTextSize(getResources().getDimension(R.dimen.textsize));
                                tv.setText(" ");
                                ll.addView(tv);
                        }

                        is.close();

                } catch (Exception e) {
                        e.printStackTrace();
                }
        }      

        ...
« Ultima modifica: 04 Novembre 2013, 09:30:40 CET da Ale »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:problema parsing con ProgressBarAsync
« Risposta #1 il: 04 Novembre 2013, 09:38:34 CET »
0
Io vedo due potenziali problemi.

Il primo è che hai messo una progressbar, ma la gestione del publishprogress non ha senso (o non l'ho proprio capita). La publishprogress dovrebbe essere dentro il parseXML e scandire l'avanzamento del parsing stesso, invece la chiami una sola volta all'inizio col valore iniziale. Se non hai modo di sapere quanti passaggi o quanti dati devi processare (per ricavarti la percentuale di avanzamento), usa una progress indeterminata (il cerchio che gira).

La seconda cosa è che stai "toccando" elementi dell'interfaccia grafica dalla doinbackground, cioè da un thread diverso da quello di UI. Secondo me questo ti genera una eccezione e l'app si blocca. In teoria un approccio simile potrebbe anche essere lecito se si tratta di prepararsi in anticipo le View, ma l'inserimento vero e proprio nella UI dovrebbe comunque avvenire dentro la onPostExecute. Ancora più a monte di tutto questo: c'è un motivo per non usare una ListView (che ti ridurrebbe drammaticamente le linee di codice)?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store