2017-10-19 25 views
1

J'ai du mal à recevoir des marqueurs google map de la base de données MySQL. J'ai ce problème java.lang.NullPointerException: Tentative d'invocation de la méthode virtuelle 'int java.util.ArrayList.size()' sur une référence d'objet null.Comment puis-je implémenter automatiquement des marqueurs de carte? Mauvaise connexion ou code erroné?

Une partie de mon code:

ArrayList<HashMap<String, String>> location = null; 
    try { 

     JSONArray data = new JSONArray(RetrieveTask.class); 

     location = new ArrayList<HashMap<String, String>>(); 
     HashMap<String, String> map; 

     for(int i = 0; i < data.length(); i++) { 
      JSONObject c = data.getJSONObject(i); 

      map = new HashMap<String, String>(); 
      map.put("id", c.getString("id")); 
      map.put("lat", c.getString("lat")); 
      map.put("lng", c.getString("lng")); 
      location.add(map); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    for (int i = 0; i < location.size/*here it shows the problem - size*/(); i++) { 
     String id = location.get(i).get("id"); 
     double lat = Double.parseDouble(location.get(i).get("lat")); 
     double lng = Double.parseDouble(location.get(i).get("lng")); 
     LatLng latLng = new LatLng(lat, lng); 
     MarkerOptions marker = new MarkerOptions().position(latLng).title(id); 
     googleMap.addMarker(marker); 
    } 

et le code de connexion au interenet:

private class RetrieveTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... voids) { 
     String strUrl = "http://12345.php"; 
     URL url = null; 
     StringBuffer sb = new StringBuffer(); 

     try { 
      url = new URL(strUrl); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      InputStream iStream = connection.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(iStream)); 
      String line = ""; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 

      reader.close(); 
      iStream.close(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return sb.toString(); 
    } 

} 

Je ne sais pas ce qui ne va pas avec mon code, je l'ai essayé différentes façons, mais toujours obtenu même erreur. Est-ce que quelqu'un a déjà eu le même problème, comment l'avez-vous résolu?

Est-ce que ce serait une erreur de base de données parce que ce n'est pas à distance, j'utilise localhost? La réponse JSON fonctionne correctement, elle renvoie les valeurs attendues.

Répondre

0

Pour que vous obteniez NPE parce que vous attrapez JSONException

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

Et vous l'avez obtenu à cause de cette ligne

JSONArray data = new JSONArray(RetrieveTask.class); 

Vous n'êtes pas obtenir des données à partir d'Internet avec cette ligne. Vous essayez juste de créer JSONArray à partir de class objet.

Vous avez eu à utiliser la méthode onPostExecute dans votre AsyncTask

protected void onPostExecute(String result) { 
    //call here method of Activity or parse your JSONArray 
    JSONArray data = new JSONArray(result); 
    //your other code 
} 
+0

Merci, j'ai juste changé mon code et maintenant ça fonctionne parfaitement. –

0

Je pense que vous ne suivez pas la procédure appropriée pour récupérer vos données à partir du localhost. Vous devez d'abord remplacer la méthode onPostExecute() d'AsyncTask, puis vous devez récupérer les données résultantes à partir de votre hôte local dans la méthode onPostExecute().

Votre code se bloque sur cette ligne

JSONArray data = new JSONArray(RetrieveTask.class); 

et donc l'emplacement n'est pas encore initialisés. Ainsi, lorsque vous essayez d'accéder à l'emplacement dans la prochaine boucle, il lève une exception NullPointerException.

Voilà comment votre code devrait ressembler à:

private class RetrieveTask extends AsyncTask<Void, Void, String> { 

@Override 
protected String doInBackground(Void... voids) { 
    String strUrl = "http://12345.php"; 
    URL url = null; 
    StringBuffer sb = new StringBuffer(); 

    try { 
     url = new URL(strUrl); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.connect(); 
     InputStream iStream = connection.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(iStream)); 
     String line = ""; 

     while ((line = reader.readLine()) != null) { 
      sb.append(line); 
     } 

     reader.close(); 
     iStream.close(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return sb.toString(); 
} 

@Override 
protected String onPostExecute(String result){ 
ArrayList<HashMap<String, String>> location = null; 
try { 

    JSONArray data = new JSONArray(result); 

    location = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> map; 

    for(int i = 0; i < data.length(); i++) { 
     JSONObject c = data.getJSONObject(i); 

     map = new HashMap<String, String>(); 
     map.put("id", c.getString("id")); 
     map.put("lat", c.getString("lat")); 
     map.put("lng", c.getString("lng")); 
     location.add(map); 
    } 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

//the if loop is to check if location is initialised above 
if(location!=null){ 
     for (int i = 0; i < location.size/*here it shows the problem - size*/(); i++) { 
      String id = location.get(i).get("id"); 
      double lat = Double.parseDouble(location.get(i).get("lat")); 
      double lng = Double.parseDouble(location.get(i).get("lng")); 
      LatLng latLng = new LatLng(lat, lng); 
      MarkerOptions marker = new MarkerOptions().position(latLng).title(id); 
      googleMap.addMarker(marker); 
     } 
    } 
} 

}

Ensuite, vous pouvez exécuter le AsyncTask ainsi:

new RetrieveTask().execute(); 

Voici un exemple de AsyncTask ça va vous aider comprendre le bon déroulement de la même chose.

You can skip to Step no. 7 to know about the Android setup for connecting to localhost

+0

Merci, je l'ai presque fait de la même manière. –