Autore Topic: ListView personalizzato: l'app crasha se inserisco più di tot elementi  (Letto 456 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Salve a tutti!

Con la mia app creo una ListView personalizzata:
Codice (Java): [Seleziona]
   protected void onPostExecute(String result) {
       
// Define a new Adapter
            // First parameter - Context
            // Second parameter - Layout for the row
            // Third parameter - ID of the TextView to which the data is written
            // Forth - the Array of data
            if(!dist2.equals("")){

            String[] split=dist2.split(",");

            ArrayList<User> arrayOfUsers= new ArrayList<User>();
            RistorantiUsersAdapter adapter2 = new RistorantiUsersAdapter(Ristoranti.this, arrayOfUsers);
                User newUser;

            for(int i=0;i<Lingua.dbristoranteName.length;i++) {
                if(!split[i].equals("")) {
                    split[i] = split[i] + "km";
                    newUser = new User(Lingua.dbristoranteName[i], split[i]);
                    adapter2.add(newUser);
                }
            }
                // Assign adapter to ListView
                listView.setAdapter(adapter2);
            }
        }
    }

Finché l'app la provo sull'emulatore va tutto bene ma appena la passo al dispositivo fisico crasha.
Dopo varie prove ho scoperto che il tutto funziona fino a che i=15, se provo a fargli inserire più di 15 elementi l'app crasha.

Il problema è che sia Lingua.dbristoranteName che split hanno entrambi 17 elementi, in Lingua.dbristoranteName li ho inseriti io da codice mentre split contiene le distanze (inserite precedentemente in dist2) con un asynktask del genere:

Codice (Java): [Seleziona]
  @Override
        protected String doInBackground(String... params) {

            for (int i = 0;i<Lingua.dbristoranteName.length; i++) {

                Double lat1 = 44.572106, lng1 = 10.369672, lat2 = 44.519423, lng2 = 10.298754;
                String url = ("http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lng1 + "&destination=" + Lingua.dbristoranteLat[i] + "," + Lingua.dbristoranteLong[i] + "&sensor=false&units=metric");
                String qResult = "";
                HttpClient Client = new DefaultHttpClient();
                HttpContext localContext = new BasicHttpContext();

                HttpGet httpget = new HttpGet(url);

                try {
                    HttpResponse response = Client.execute(httpget, localContext);
                    HttpEntity entity = response.getEntity();

                    if (entity != null) {
                        InputStream stream = entity.getContent();
                        Reader in = new InputStreamReader(stream);
                        BufferedReader buffreader = new BufferedReader(in);
                        StringBuilder Builder = new StringBuilder();
                        String StringReadLine = null;
                        while ((StringReadLine = buffreader.readLine()) != null) {
                            Builder.append(StringReadLine + "\n");
                        }
                        qResult = Builder.toString();
                    }
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                    Toast.makeText(Ristoranti.this, e.toString(), Toast.LENGTH_LONG)
                            .show();
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(Ristoranti.this, e.toString(), Toast.LENGTH_LONG)
                            .show();
                }

                JSONObject jsonObject = new JSONObject();
                try {

                    jsonObject = new JSONObject(qResult);

                    JSONArray array = jsonObject.getJSONArray("routes");

                    JSONObject routes = array.getJSONObject(0);

                    JSONArray legs = routes.getJSONArray("legs");

                    JSONObject steps = legs.getJSONObject(0);

                    JSONObject distance = steps.getJSONObject("distance");

                    Log.i("Distance", distance.toString());
                    if(i==0) {
                        dist2=(distance.getString("text").replaceAll("[^\\.0123456789]", ""));
                    }
                    if(i!=0){
                        dist2 =dist2+","+ (distance.getString("text").replaceAll("[^\\.0123456789]", ""));
                    }

                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();

                }
            }
                return dist2;

            }

avete qualche suggerimento?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ListView personalizzato: l'app crasha se inserisco più di tot elementi
« Risposta #1 il: 03 Marzo 2015, 17:28:33 CET »
0
il mio unico suggerimento è postare il log del crash
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:ListView personalizzato: l'app crasha se inserisco più di tot elementi
« Risposta #2 il: 04 Marzo 2015, 08:54:41 CET »
0
Purtroppo ieri non sono riusci a dare il logcat perché mi dava dei problemi di "porta" per il debug del mio device , però stamattina ho fatto qualche cambiamento nel codice e sono arrivato alla conclusione che non sempre split ha 17 elementi al suo interno.
Facendo l'opportuno debug sono arrivato a questa riga di codice nel logcat:
Codice: [Seleziona]
03-04 08:48:41.619    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ org.json.JSONException: Index 0 out of range [0..0)
03-04 08:48:41.619    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at org.json.JSONArray.get(JSONArray.java:263)
03-04 08:48:41.619    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at org.json.JSONArray.getJSONObject(JSONArray.java:480)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at com.example.adorni.NevianoApp.Ristoranti$GetInfo.doInBackground(Ristoranti.java:165)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at com.example.adorni.NevianoApp.Ristoranti$GetInfo.doInBackground(Ristoranti.java:71)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-04 08:48:41.629    5827-5890/com.NevianoApp.adorni.turisticapp W/System.err﹕ at java.lang.Thread.run(Thread.java:856)

posso capire che ci sia un errore nel parsing del json però mi chiedo il perché... i parsing successivi e precedenti li fa senza alcun problema

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:ListView personalizzato: l'app crasha se inserisco più di tot elementi
« Risposta #3 il: 04 Marzo 2015, 09:50:38 CET »
0
Il problema potrebbe essere in una di queste due righe:

Codice (Java): [Seleziona]
JSONObject routes = array.getJSONObject(0);
JSONObject steps = legs.getJSONObject(0);

Perchè non sai se esiste l'elemento "0". L'array potrebbe essere vuoto e dovresti controllare la lunghezza prima di accedervi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:ListView personalizzato: l'app crasha se inserisco più di tot elementi
« Risposta #4 il: 04 Marzo 2015, 12:06:41 CET »
0
ok ho capito!

Comunque non mi ha più dato che problema anche se ho fatto in modo di gestire quell'errore.

Vorrei fare un'ultima domanda, così non devo rispiegare tutto e ripostare lo stesso codice in un'altro topic.

Io uso questo link (http://maps.googleapis.com/maps/api/directions/json?origin=44.572106,10.369672&destination=44.519423,10.298754&sensor=false&units=metric) per ottenere  la distanza da un punto ad un'altro e il tempo di percorrenza in macchina, come faccio ad ottenere il tempo di percorrenza a piedi?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ListView personalizzato: l'app crasha se inserisco più di tot elementi
« Risposta #5 il: 04 Marzo 2015, 14:09:15 CET »
0
ok ho capito!

Comunque non mi ha più dato che problema anche se ho fatto in modo di gestire quell'errore.

Vorrei fare un'ultima domanda, così non devo rispiegare tutto e ripostare lo stesso codice in un'altro topic.

Io uso questo link (http://maps.googleapis.com/maps/api/directions/json?origin=44.572106,10.369672&destination=44.519423,10.298754&sensor=false&units=metric) per ottenere  la distanza da un punto ad un'altro e il tempo di percorrenza in macchina, come faccio ad ottenere il tempo di percorrenza a piedi?
solitamente quando si una un link/API, e si ha bisogno di una modifica/estensione, si va a vedere la documentazione delle api...
https://developers.google.com/maps/documentation/directions/#TravelModes
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:ListView personalizzato: l\'app crasha se inserisco più di tot elementi
« Risposta #6 il: 06 Marzo 2015, 09:54:05 CET »
0
solitamente quando si una un link/API, e si ha bisogno di una modifica/estensione, si va a vedere la documentazione delle api...
https://developers.google.com/maps/documentation/directions/#TravelModes

Si hai ragione scusami ^^''

Il problema potrebbe essere in una di queste due righe:

Codice (Java): [Seleziona]
JSONObject routes = array.getJSONObject(0);
JSONObject steps = legs.getJSONObject(0);

Perchè non sai se esiste l'elemento "0". L'array potrebbe essere vuoto e dovresti controllare la lunghezza prima di accedervi.

c'è un modo per evitare questa situazione? cioè che io riceva un dato sbaglio oppure non lo ricevo affatto?
per ora ho fatto in modo che quando ho un errore nel parsing del json metto "xxx" nel valore e lo faccio continuare, ma sarebbe carino se ricevessi tutti i dati

Post unito: 06 Marzo 2015, 11:05:00 CET
Ok ho risolto
!

Con la documentazione ho trovato un link più "leggero" : https://maps.googleapis.com/maps/api/distancematrix/json?origins=44.7219926,10.2936575&destinations=44.519063,10.296077&mode=walking

grazie a tutti per l'aiuto!
« Ultima modifica: 06 Marzo 2015, 11:05:01 CET da ValerioAdo, Reason: Merged DoublePost »