2016-03-23 7 views
-1

Also habe ich eine Anwendung, die Informationen aus einer API mit Retrofit als Bibliothek bezieht. Ich dachte, ich hatte alles funktioniert, aber wenn ich die Anwendung ausführen ich eine Null-Zeiger Ausnahme erhalten und die App-Abstürze und ich bin nicht sicher, warum:Schwerwiegende Ausnahme, wenn ich meine Anwendung (Nachrüstung) ausführe?

Die Schnittstelle, die Nachrüstung baut:

public interface FriendsAPI { 

    static final String URL = "https://www.cs.kent.ac.uk/"; 

    @GET("https://www.cs.kent.ac.uk/people/staff/iau/LocalUsers.php") 
    Call<User> getFriends(); 

    class Factory { 

     private static FriendsAPI service; 
     public static FriendsAPI getInstance() { 
      if (service == null) { 
       Retrofit retrofit = new Retrofit.Builder() 
         .addConverterFactory(GsonConverterFactory.create()) 
         .baseUrl(URL) 
         .build(); 
       return service; 

      } else { 
       return service; 
      } 
     } 
    } 
} 

Speichert die JSON Array in eine Liste:

public class FriendsInfo { 

    @SerializedName("Users") 
    @Expose 
    private List<User> Users = new ArrayList<User>(); 

    /** 
    * 
    * @return 
    *  The Users 
    */ 
    public List<User> getUsers() { 
     return Users; 
    } 

    /** 
    * 
    * @param Users 
    *  The Users 
    */ 
    public void setUsers(List<User> Users) { 
     this.Users = Users; 
    } 
} 

Schließlich, wo ich es bin Aufruf (und der Code, der die schwerwiegenden Ausnahme auslöst, obwohl ich weiß nicht, warum):

public void populateFriends(){ 

     FriendsAPI.Factory.getInstance().getFriends().enqueue(new Callback<User>() { 
      @Override 
      public void onResponse(Call<User> call, Response<User> response) { 
       String tempLat = response.body().getLat(); 
       String tempLon = response.body().getLon(); 
       tLat = Double.parseDouble(tempLat); 
       tLon = Double.parseDouble(tempLon); 
      } 

      @Override 
      public void onFailure(Call<User> call, Throwable t) { 
       Log.e("Failed :(",t.getMessage()); 
      } 
     }); 
    } 

Ich denke, ich habe alle relevanten Code enthalten, aber wenn etwas fehlt, kann ich es hier posten. Ich habe auch eine vollständigere Version des Projekts auf Github.

Vielen Dank im Voraus Jungs.

+0

Sind Sie sicher, dass "tempLat" und "tempLon" nicht "null" sind? Sie sollten eine 'Null'-Prüfung hinzufügen, bevor Sie sie doppelt analysieren. – user2004685

+0

Hmm Ich füge jetzt einen Check hinzu, aber ich bin mir nicht sicher, warum sie null zurückgeben, wenn das der Fall ist, sollten sie nicht Werte von der API zurückgeben? – Cypher236

+0

Es könnte die Antwort zurückgeben, aber dann müssen Sie das überprüfen. Außerdem müssen Sie sicherstellen, dass Sie die empfangene Antwort ordnungsgemäß analysieren. – user2004685

Antwort

1

Sie haben nichts zu service innerhalb getInstance() geschrieben. Daher ist es immer null. Sie müssen das Objekt retrofit.create()service zuweisen.

public static FriendsAPI getInstance() { 
      if (service == null) { 
       Retrofit retrofit = new Retrofit.Builder() 
         .addConverterFactory(GsonConverterFactory.create()) 
         .baseUrl(URL) 
         .build(); 
       service = retrofit.create(FriendsAPI.class); //Add this line 
       return service; 

      } else { 
       return service; 
      } 
     } 
    } 

      } else { 
       return service; 
      } 
     } 
+0

Danke, das habe ich vermisst! Ich habe den Code aktualisiert, wenn ich es jetzt ausführen, obwohl ich einen etwas anderen Fehler bekomme http://pastebin.com/5CNV68wv – Cypher236

+0

Das ist, weil Sie null Wert in java.lang.Double.doubleValue() in OnMapReady Callback übergeben . –

+0

Hmmm ok Ich werde die Quelle herausfinden müssen, dass es kein Nullwert sein sollte. Danke für die Hilfe! – Cypher236

1

Wenn der Service ist null Sie null zurück, ändern Sie es wie diese

class Factory { 
    private static MyApiEndpointInterface service; 

     if (service == null) { 
      Retrofit retrofit = new Retrofit.Builder() 
        .addConverterFactory(GsonConverterFactory.create()) 
        .baseUrl(URL) 
        .build(); 
      service=retrofit.create(FriendsApi.class); 
      return service; 

     } else { 
      return service; 
     } 
    } 
} 
+0

Danke, ich werde das jetzt ändern Edit: Ich bekomme eine Warnung über inkompatible Typen, wenn ich das schreibe? – Cypher236

+0

Sie haben ein Problem mit Ihrer Dienstinstanz, ändern Sie den Typ in MyApiEndpointInterface und Sie instanziieren es wie service = retrofit.create (FriendsApi.class); Ich habe meinen Beitrag editiert, einen Blick darauf geworfen. – jonhid

Verwandte Themen