Autore Topic: Strano problema parsing  (Letto 383 volte)

Offline fragia

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Note II
  • Sistema operativo:
    Mac OS X
Strano problema parsing
« il: 26 Giugno 2014, 19:57:06 CEST »
0
Salve,

io ho 2 file che fanno il parsing di un file xml,  tutto funziona se io utilizzo questi file da soli

quando importo i file nel mio progetto e richiamo il file tramite bottone mi notifica errore riprendo i due file e li metto da soli funzionano :-(

Vi chiedo un aiuto non so proprio cosa fare...


AGGIORNAMENTO

Ho provato a mettere un try catch(NullPointerException e) dopo il controllo della connessione e l'app non va in crash ma però non visualizza nessun dato :-(



File 01
Codice (Java): [Seleziona]
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.util.Log;

public class XMLParser {

        // constructor
        public XMLParser() {

        }


        public String getXmlFromUrl(String url) {
                String xml = null;

                try {
                        // defaultHttpClient
                        DefaultHttpClient httpClient = new DefaultHttpClient();
                        HttpPost httpPost = new HttpPost(url);

                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        HttpEntity httpEntity = httpResponse.getEntity();
                        xml = EntityUtils.toString(httpEntity);

                } catch (UnsupportedEncodingException e) {
                //      e.printStackTrace();
                } catch (ClientProtocolException e) {
                //      e.printStackTrace();
                } catch (IOException e) {
                //      e.printStackTrace();
                }
                // return XML
                return xml;
        }
       

        public Document getDomElement(String xml){
                Document doc = null;
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                try {

                        DocumentBuilder db = dbf.newDocumentBuilder();

                        InputSource is = new InputSource();
                        is.setCharacterStream(new StringReader(xml));
                        doc = db.parse(is);

                        } catch (ParserConfigurationException e) {
                        //      Log.e("Error: ", e.getMessage());
                                return null;
                        } catch (SAXException e) {
                        //      Log.e("Error: ", e.getMessage());
                    return null;
                        } catch (IOException e) {
                        //      Log.e("Error: ", e.getMessage());
                                return null;
                        }

                return doc;
        }
       

         public final String getElementValue( Node elem ) {
             Node child;
             if( elem != null){
                 if (elem.hasChildNodes()){
                     for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                         if( child.getNodeType() == Node.TEXT_NODE  ){
                             return child.getNodeValue();
                         }
                     }
                 }
             }
             return "";
         }
         

         public String getValue(Element item, String str) {            
                        NodeList n = item.getElementsByTagName(str);           
                        return this.getElementValue(n.item(0));
                }
}

File 02
Codice (Java): [Seleziona]
package it.dev.android.lagodelleginestre;

import java.util.ArrayList;
import java.util.HashMap;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class AndroidXMLParsingActivity extends ListActivity {
       

        // All static variables
        static final String URL = "http://api.androidhive.info/pizza/?format=xml";
       


        // Mio
        static final String KEY_ITEM = "item"; // parent node
        static final String KEY_ID = "id";
        static final String KEY_DATA = "data";
        static final String KEY_NOME = "nome";
        static final String KEY_CLASSIFICA01 = "classifica01";
        static final String KEY_CLASSIFICA02 = "classifica02";
        static final String KEY_CLASSIFICA03 = "classifica03";
        static final String KEY_NOTE = "note";

        //
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
// Controllo Connesione
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean connessioneDisponibile=false;
        if(cm!=null && cm.getActiveNetworkInfo()!=null){
         //controllo disponibilit√† di rete
         connessioneDisponibile= cm.getActiveNetworkInfo().isConnectedOrConnecting();
          }
// Fine controllo connesione
       
       
 if(connessioneDisponibile){   

                ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

                XMLParser parser = new XMLParser();
                String xml = parser.getXmlFromUrl(URL); // getting XML
                Document doc = parser.getDomElement(xml); // getting DOM element

if (doc !=null) {       // if controllo se file presente
               
                NodeList nl = doc.getElementsByTagName(KEY_ITEM);
                // looping through all item nodes <item>
                for (int i = 0; i < nl.getLength(); i++) {
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
                        Element e = (Element) nl.item(i);
                        // adding each child node to HashMap key => value
                        map.put(KEY_ID, parser.getValue(e, KEY_ID));
                        map.put(KEY_DATA, parser.getValue(e, KEY_DATA));
                        map.put(KEY_NOME, parser.getValue(e, KEY_NOME));
                        map.put(KEY_CLASSIFICA01, parser.getValue(e, KEY_CLASSIFICA01));
                        map.put(KEY_CLASSIFICA02, parser.getValue(e, KEY_CLASSIFICA02));
                        map.put(KEY_CLASSIFICA03, parser.getValue(e, KEY_CLASSIFICA03));
                        map.put(KEY_NOTE, parser.getValue(e, KEY_NOTE));

                        // adding HashList to ArrayList
                        menuItems.add(map);
                }

                // Adding menuItems to ListView // Ho Messo solo data e nome perchÔøΩ sono i campi presenti nella listView ma sip posso Aggiungere altri
               
                ListAdapter adapter = new SimpleAdapter(this, menuItems,
                                R.layout.lista_gare,
                                new String[] { KEY_DATA, KEY_NOME, KEY_CLASSIFICA01, KEY_CLASSIFICA02, KEY_CLASSIFICA03, KEY_NOTE }, new int[] {
                                                R.id.data, R.id.nome,  R.id.classifica01,  R.id.classifica02, R.id.classifica03, R.id.note, });

                setListAdapter(adapter);

                // selecting single ListView item
                ListView lv = getListView();
               
                lv.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {
                                // getting values from selected ListItem
                                String data                 = ((TextView) view.findViewById(R.id.data)).getText().toString();
                                String nome         = ((TextView) view.findViewById(R.id.nome)).getText().toString();
                                String classifica01 = ((TextView) view.findViewById(R.id.classifica01)).getText().toString();
                                String classifica02 = ((TextView) view.findViewById(R.id.classifica02)).getText().toString();
                                String classifica03 = ((TextView) view.findViewById(R.id.classifica03)).getText().toString();
                                String note         = ((TextView) view.findViewById(R.id.note)).getText().toString();
                               
                        //extView bordo= (TextView) findViewById(R.id.linea_sinistra);                         
                //bordo.setBackgroundColor(Color.GREEN);
                               
                               
                                // Starting new intent
                                Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                                in.putExtra(KEY_DATA, data);
                                in.putExtra(KEY_NOME, nome);
                                in.putExtra(KEY_CLASSIFICA01,classifica01);
                                in.putExtra(KEY_CLASSIFICA02,classifica02);
                                in.putExtra(KEY_CLASSIFICA03,classifica03);
                                in.putExtra(KEY_NOTE,note);
                                startActivity(in);

                        }
                });
               
}

else// else del cotrollo se file presente
{
               
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("Avviso");
        builder.setMessage("Problemi recupero Dati, riprova piu' tardi");
        builder.show();                
          // Toast t=new Toast(AndroidXMLParsingActivity.this);
     //  t.makeText(this, "File non presente", Toast.LENGTH_LONG).show();
         
}// fine else file presente
               
 }//fine if connessione disponibile
 
 else // Else del controllo connesione
 {
         
                AlertDialog.Builder builder=new AlertDialog.Builder(this);
                builder.setTitle("Avviso");
                builder.setMessage("Connessione Internet non presente, controlla");
                builder.show();        
//         Toast t=new Toast(AndroidXMLParsingActivity.this);
//     t.makeText(this, "Connessione non disponibile", Toast.LENGTH_LONG).show();
         
 } // Fine else controllo connesione
               
        }// fine oncreate
}// fine classe


ERRORE
Citazione
06-26 13:27:27.520: E/AndroidRuntime(2520): FATAL EXCEPTION: main
06-26 13:27:27.520: E/AndroidRuntime(2520): Process: com.lagodelleginestre, PID: 2520
06-26 13:27:27.520: E/AndroidRuntime(2520): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.dev.android.lagodelleginestre/it.dev.android.lagodelleginestre.AndroidXMLParsingActivity}: android.os.NetworkOnMainThreadException
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.os.Looper.loop(Looper.java:136)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.ActivityThread.main(ActivityThread.java:5017)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at java.lang.reflect.Method.invokeNative(Native Method)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at java.lang.reflect.Method.invoke(Method.java:515)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at dalvik.system.NativeStart.main(Native Method)
06-26 13:27:27.520: E/AndroidRuntime(2520): Caused by: android.os.NetworkOnMainThreadException
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

06-26 13:27:27.520: E/AndroidRuntime(2520):    at com.lagodelleginestre.XMLParser.getXmlFromUrl(XMLParser.java:42)

06-26 13:27:27.520: E/AndroidRuntime(2520):    at com.android.lagodelleginestre.AndroidXMLParsingActivity.onCreate(AndroidXMLParsingActivity.java:65)

06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.Activity.performCreate(Activity.java:5231)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-26 13:27:27.520: E/AndroidRuntime(2520):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
06-26 13:27:27.520: E/AndroidRuntime(2520):    ... 11 more

« Ultima modifica: 26 Giugno 2014, 21:20:47 CEST da fragia »

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Strano problema parsing
« Risposta #1 il: 26 Giugno 2014, 22:27:01 CEST »
0
Questa eccezione viene generata quando un'applicazione tenta di eseguire un'operazione di networking (pesanti) sul tuo thread principale. Dovresti utilizzare l'asyncTask :  AsyncTask | Android Developers



Offline fragia

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Note II
  • Sistema operativo:
    Mac OS X
Re:Strano problema parsing
« Risposta #2 il: 26 Giugno 2014, 22:59:29 CEST »
0
Ciao,

grazie intato per la risposta...

ma perchè se nel progetto ci sono solo loro funziona e se li inserisco nella mia app mi da errore?

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Strano problema parsing
« Risposta #3 il: 26 Giugno 2014, 23:04:29 CEST »
0
Sicuramente nella tua applicaIone implementi del codice che non può essere gestito nel mani thread , comunque guardati questa guida . Se hai bisogno fa sapere L'eccezione android.os.NetworkOnMainThreadException &raquo;Luca Zanini

Offline fragia

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Note II
  • Sistema operativo:
    Mac OS X
Re:Strano problema parsing
« Risposta #4 il: 26 Giugno 2014, 23:48:14 CEST »
0
Ciao,

grazie almeno ho capito il problema...
scusa se mi permetto essendo principiante principiante e sto facendo questa semplice app solo per il mio laghetto di pesca
potresti darmi qulche dritta su come inserire questo sistema asincrono nel codice nel mio progetto