2016-03-23 3 views
-1

私はライブラリとしてretrofitを使用してAPIから情報を引き出すアプリケーションを持っています。私はそれがすべて働いていたと思ったが、私はnullポインタ例外とアプリのクラッシュを取得し、私がなぜわからないんだアプリケーションを実行するたび:改造を構築私のアプリケーション(改造)を実行すると致命的な例外はありますか?

インタフェース:

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

のように変更します。したがって、常に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

ありがとう、私はそれを逃した!私はコードを更新しましたが、少し違うエラーが発生しましたが、これを実行しました。 – Cypher236

+0

これは、onMapReadyコールバックでjava.lang.Double.dueValue()にnull値を渡しているためです。 。 –

+0

Hmmm ok私は、それがヌル値であってはならないという情報源を追跡しなければならないでしょう。助けてくれてありがとう! – Cypher236

1

サービスがnullの場合はnullを返し、あなたがgetInstance()serviceには何も書かれていないこの

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

関連する問題