2016-03-23 2 views
-1

Итак, у меня есть приложение, которое извлекает информацию из API с помощью модификации в качестве библиотеки. Я думал, что все это работает, но всякий раз, когда я запустить приложение я получаю исключения нулевого указателя и сбои приложений, и я не уверен, почему:Неустранимая исключение при запуске моего приложения (дооснащение)?

интерфейс, который строит дооснащения:

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; 
      } 
     } 
    } 
} 

Хранит JSON массив в список:

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; 
    } 
} 

Наконец, где я звоню его (и код, который вызывает фатальное исключение, хотя я не знаю, почему):

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()); 
      } 
     }); 
    } 

Я думаю, что я включил весь соответствующий код, но если что-то не хватает, я могу опубликовать его здесь. У меня также есть более полная версия проекта на Github.

Спасибо заранее, ребята.

+0

Вы уверены, что 'tempLat' &' tempLon' не 'null'? Вы должны добавить проверку «null», прежде чем разбирать ее, чтобы удвоить. – user2004685

+0

Хмм, я добавлю чек сейчас, но я не уверен, почему они возвращают null, если это так, разве они не должны возвращать значения из API? – Cypher236

+0

Это может быть ответ, но тогда вам придется это проверить. Кроме того, вам нужно убедиться, что вы правильно разобрали полученный ответ. – user2004685

ответ

1

Вы не написали ничего service внутри getInstance(). Следовательно, это всегда null. Вам необходимо присвоить retrofit.create() объект service.

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

Спасибо, я пропустил это! Я обновил код, когда я запустил его, хотя у меня есть несколько другая ошибка. Http://pastebin.com/5CNV68wv – Cypher236

+0

Это потому, что вы передаете значение null в java.lang.Double.doubleValue() в обратном вызове onMapReady , –

+0

Хммм Хорошо, мне придется отследить источник, что это не должно быть нулевое значение. Спасибо за помощь! – Cypher236

1

Если услуга является нулевым возврате пустой, изменить его, как этот

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

Спасибо, что я сейчас поменю Редактировать: Я получаю предупреждение о несовместимых типах, когда пишу это? – Cypher236

+0

У вас возникла проблема с вашим экземпляром службы, измените тип на MyApiEndpointInterface, и вы выполните его как service = retrofit.create (FriendsApi.class); Я редактирую свой пост, посмотрю. – jonhid

Смежные вопросы