Autore Topic: Xml e parsing dei dati  (Letto 1924 volte)

Offline xixietto

Xml e parsing dei dati
« il: 02 Settembre 2017, 08:16:52 CEST »
0
Salve sto avendo dei problemi con il parsing xml.. praticamente la mia applicazione dovrebbe prevelevare dei dati da un database esterno e visualizzarli all'utente finale.  I dati vengono presi e visualizzati normalmente.. ma a volte questo non succede e mi restituisce una risultato vuoto.

Preciso che l'url non cambia è sempre lo stesso..solo che a volte mi da il risultato è a volte no.
 
Spero di aver chiarito la mia domanda.. spero in qualche consiglio

Per essere più chiaro e se posso.. metto il link dell'app https://play.google.com/store/apps/details?id=com.fabrizio_project.meatapp_free

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #1 il: 02 Settembre 2017, 16:58:43 CEST »
0
In primis dovresti spiegare in che modo gestisci il recupero dei dati (Retrofit, Retrofit2, Fuel, etc...), come fai il parsing (se e quale libreria usi).
Qualche log non sarebbe male :)
Se posso consigliarti qualcosa io utilizzerei JSON per l'interscambio di dati REST, per motivi che non sto qui a spiegare, comunque servono più info per poterti aiutare.

Ciao, Massimo

Offline xixietto

Re:Xml e parsing dei dati
« Risposta #2 il: 02 Settembre 2017, 17:14:02 CEST »
0
 Io in effetti uso i json e nessuna libreria..

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #3 il: 02 Settembre 2017, 17:29:00 CEST »
0
Il topic è "Xml e parsing dei dati" :)

Comunque prova a darci più info altrimenti non riesco ad aiutarti.

Offline xixietto

Re:Xml e parsing dei dati
« Risposta #4 il: 03 Settembre 2017, 10:48:49 CEST »
0
Ti posto direttamente il codice.. richiamo un url json per la prelevazione dei dati da un database esterno..il problema è che a volte mi trova risultati e altre volte non trova nulla.. pur inserendo lo stesso url

Codice (Java): [Seleziona]
   private ListView lv;
    EditText prendi_azienda;
    FloatingActionButton invia;
    // URL to get contacts JSON
    String url_stabilimenti;
    ListAdapter adapter;
    ArrayList<HashMap<String, String>> contactList;
    Intent intent;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_three, container, false);
        contactList = new ArrayList<>();
        prendi_azienda= (EditText) view.findViewById(R.id.editText7);
        invia=(FloatingActionButton) view.findViewById(R.id.fab);
        lv = (ListView) view.findViewById(R.id.list);
        // Inflate the layout for this fragment
        progressBar = (ProgressBar) view.findViewById(R.id.progressBar);

        prendi_azienda.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(prendi_azienda.getWindowToken(), 0);
                    return true;
                }
                return false;
            }
        });

        invia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                String prendi = prendi_azienda.getText().toString().toUpperCase();
                if (prendi.trim().isEmpty()) {
                    // visualizzo un messaggio definito in strings.xml
                    prendi_azienda.setError(getText(R.string.errore));
                    // attivo il controllo
                    prendi_azienda.requestFocus();
                    return;
                }
                else{
                    InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(prendi_azienda.getWindowToken(), 0);
                    url_stabilimenti="http://opendatasalutedata.cloudapp.net/v1/datacatalog/STABILIMENTI853?$filter=approval_number eq '"+prendi+"'or approval_number_2 eq'"+prendi+"'&format=json";
                    new GetContacts().execute();

                }}});

        return view;
    }

    private class GetContacts extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            //OnPreExecute () , richiamato nel thread UI prima dell'esecuzione del compito. Qui Noi mostriamo messaggio di caricamento.
            super.onPreExecute();
            // Showing progress dialog
            contactList.clear();
            progressBar.setVisibility(View.VISIBLE);

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            //doInBackground (Parametri ...) , invocati sul thread in background immediatamente dopo
            // OnPreExecute () termina l'esecuzione. La recieving dei dati da JSON file usando HttpURLConnection di classe ha fatto in questa funzione.
            HttpHandler sh = new HttpHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url_stabilimenti);

            Log.e(TAG, "Risposta da url:" + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    JSONArray contacts = jsonObj.getJSONArray("d");
                    if (contacts.length()> 0) {
                    // looping through All Contacts
                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);

                        //String id = c.getString("id");
                        String name = c.getString("approval_number");
                        String ragione_sociale = c.getString("ragione_sociale");
                        String indirizzo = c.getString("indirizzo");
                        String desc_impianto_attivita = c.getString("desc_impianto_attivita");
                        //  String gender = c.getString("gender");
                        // tmp hash map for single contact
                        HashMap<String, String> contact = new HashMap<>();

                        // adding each child node to HashMap key => value
                        //   contact.put("id", id);
                        contact.put("name", name);
                        contact.put("ragione_sociale", ragione_sociale);
                        contact.put("indirizzo", indirizzo);
                        contact.put("desc_impianto_attivita", desc_impianto_attivita);
                        // adding contact to contact list
                        contactList.add(contact);
                    }}
                    else{
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getApplicationContext(),
                                        "Non ho trovato nessun risultato, riprova...",
                                        Toast.LENGTH_LONG)
                                        .show();
                            }
                        });
                        }
                }
                        catch (final JSONException e) {
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Non ho trovato nessun risultato, riprova...",
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "C'è qualcosa che non va:" + e.getMessage(),
                                    Toast.LENGTH_LONG)
                                    .show();}});}
            } else {

                Log.e(TAG, "Indirizzo non corretto");
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "C'è qualcosa che non va, controlla la tua rete.",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }

            return null;
        }


        @Override
        protected void onPostExecute(Void result) {
            //OnPostExecute (Risultato) , richiamato nel thread UI dopo la fine sfondo di calcolo. Qui stiamo estrazione di dati ricevuto da file di JSON e Android JSON di analisi sarà fatto.
            super.onPostExecute(result);
            // Dismiss the progress dialog
            progressBar.setVisibility(View.GONE);

            /**
             * Updating parsed JSON data into ListView
             * */

            ListAdapter adapter = new SimpleAdapter(
                    getActivity(), contactList,
                    R.layout.aziende_activity_item, new String[]{"name", "ragione_sociale", "indirizzo","desc_impianto_attivita"},
                    new int[]{R.id.name,R.id.email, R.id.mobile,R.id.desc_impianto_attivita});

            lv.setAdapter(adapter);
        }

    }
    //menu
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_controllo, menu);
        super.onCreateOptionsMenu(menu, inflater);
    } @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.info_point:
                android.app.AlertDialog.Builder builder=new android.app.AlertDialog.Builder(getActivity());
                View view= LayoutInflater.from(getActivity()).inflate(R.layout.controllo_azienda,null);
                builder.setView(view);
                builder.setCancelable(false);

                builder.setPositiveButton(R.string.Chiudi, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();
                    }

                });
                builder.show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}
« Ultima modifica: 03 Settembre 2017, 11:07:26 CEST da xixietto »

Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #5 il: 03 Settembre 2017, 17:11:50 CEST »
0
Ho dato un'occhiata così e avrei un paio di cose da dirti:

1. Hai provato ad inviare la stessa richiesta più volte con Postman ad esempio (potrebbe essere che il server non accetta troppe chiamate consecutive)?
2. Hai verificato lo status della risposta quando non ti ritorna nulla?
3. Non è mai consigliato applicare filtri nelle richieste tramite GET URL, o almeno che tipo di server usi per gestire queste richieste NodeJS?
     Nel caso tu abbia accesso al tuo backend io farei diversamente:
        modificherei la chiamata GET in "http://opendatasalutedata.cloudapp.net/v1/datacatalog/STABILIMENTI853/prendi"
        e farei gestire al server il filtro OR...o altri filtri da applicare, non gestire MAI dal client questo tipo di casistiche a meno che non debba per forza fare così.
4. Come ti ho detto in precedenza io userei Retrofit2 e RxJava2 per gestire tutto il flusso:
     - Meno codice.
     - Parsing automatico del risultato tramite GSON o Jackson.
     - Gestione con gli Observable dei processi in background.
5. NON FONDAMENTALE: sarebbe "consigliato" trasferire dati sensibili su protocollo HTTPS :)

Comunquesia la cosa migliore che posso consigliarti è quella di testare le tue richieste con Postman e verificarne il risultato e poi passare a modificare il codice.

Sarebbe tutto molto più semplice (x me) se utilizzassi Kotlin come linguaggio ti potrei aiutare a implementare tutta la procedura.

Ciao, Massimo

Offline xixietto

Re:Xml e parsing dei dati
« Risposta #6 il: 03 Settembre 2017, 17:18:55 CEST »
0
Scusa la mia domanda ma cos'è postman? Mi potresti dire dove mettere il controllo in caso mi ritorna null?

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline xixietto

Re:Xml e parsing dei dati
« Risposta #7 il: 03 Settembre 2017, 17:21:35 CEST »
0
Purtroppo non posso modificare l'opzione dei filtri.. Perché non è un mio server..

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #8 il: 03 Settembre 2017, 17:24:56 CEST »
0
Ho provato con Postman a fare delle richieste, potresti fornirmi dei filtri che dovrebbero ritornare risultati?
la risposta è sempre:
{
    "d": []
}

ho notato anche che il server impiega circa 8s per rispondere, un tempo notevole per una richiesta API quindi il tuo problema potrebbe anche essere di timeout

Offline xixietto

Re:Xml e parsing dei dati
« Risposta #9 il: 03 Settembre 2017, 17:26:48 CEST »
0
In pratica quel server sarebbe un database ufficiale.. dove io nn posso mettere mano.. ecco perché ho cercato di applicate quei filtri.  Anche per velocizzare la ricerca dei dati interessati

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #10 il: 03 Settembre 2017, 17:33:49 CEST »
0
Parametri di esempio?

Offline xixietto

Re:Xml e parsing dei dati
« Risposta #11 il: 03 Settembre 2017, 17:35:23 CEST »
0
Approval_number = 021m o anche 1765L

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #12 il: 03 Settembre 2017, 17:52:41 CEST »
0
Ho fatto una cinquantina di test e sembra che il server funzioni correttamente...

Offline xixietto

Re:Xml e parsing dei dati
« Risposta #13 il: 03 Settembre 2017, 17:53:49 CEST »
0
Bene! Sto un Po nel pallone.. Mi potresti dare una mano con il codice :'/ giusto per capire bene il problema

Inviato dal mio SM-G925F utilizzando Tapatalk


Offline m.caroccia83

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Xml e parsing dei dati
« Risposta #14 il: 03 Settembre 2017, 17:55:43 CEST »
0
Te l'ho detto purtroppo Java l'ho abbandonato da un bel pò...sin da quando sono uscite le prime versioni di Kotlin (devo dirti la verità ne sono felice), purtroppo se utilizzavi Kotlin volentieri.