2017-02-24 15 views
0

Retrofit 2を使用して、特定のサブレディットからReddit情報を取得しようとしています。多くのチュートリアルやビデオに従っており、コードは私の観点からは正しいようですが、私のモデルクラスのオブジェクト。私はマニフェストでインターネットの許可を得ています。Retrofit 2を使用してサーバーからデータを受信して​​いません

これはリンクになって、私はHERE

MainActivity

public class MainActivity extends AppCompatActivity 
{ 
    TextView mTextView; 
    Data mData; 
    private static final String TAG = "Battlestations"; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    mTextView = (TextView) findViewById(R.id.test_view); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Call<Data> serviceCall = Service.getDesktopService().desks(); 
    serviceCall.enqueue(new Callback<Data>() 
    { 
     @Override 
     public void onResponse(Call<Data> call, Response<Data> response) 
     { 

      Log.d("Reponce","return"); 
      Log.i(TAG, "Response is " + mData.getChildren()); 
     } 

     @Override 
     public void onFailure(Call<Data> call, Throwable t) 
     { 

     } 
    }); 
    } 
} 

API /サービスクラス

public class Service 
{ 
    private static final String BASE_URL = "https://www.reddit.com/r/"; 
    private static DeskInterface mRetrofit; 


    public static DeskInterface getDesktopService() 
    { 
     if(mRetrofit == null) 
     { 
      Retrofit build = new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 

      mRetrofit = build.create(DeskInterface.class); 
     } 
     return mRetrofit; 
    } 

    public interface DeskInterface 
    { 
     @GET("battlestations/hot/.json") 
     Call<Data> desks(); 
    } 

} 

データ

public class Data 
{ 
    private List<Child> children = null; 

    public List<Child> getChildren() 
    { 
     return children; 
    } 

    public void setChildren(List<Child> children) 
    { 
     this.children = children; 
    } 
} 

子供で働いていますJSONあなたはonResponse()mData = response.body()を追加する必要が

public class Child 
{ 
    private Data_ data; 

    public Data_ getData() 
    { 
     return data; 
    } 

    public void setData(Data_ data) 
    { 
     this.data = data; 
    } 
} 

DATA_

public class Data_ 
{ 
    private String subreddit; 
    private Integer score; 
    private String author; 
    private String subredditNamePrefixed; 
    private String url; 
    private String title; 

    public String getSubreddit() 
    { 
     return subreddit; 
    } 

    public void setSubreddit(String subreddit) 
    { 
     this.subreddit = subreddit; 
    } 

    public Integer getScore() 
    { 
     return score; 
    } 

    public void setScore(Integer score) 
    { 
     this.score = score; 
    } 

    public String getAuthor() 
    { 
     return author; 
    } 

    public void setAuthor(String author) 
    { 
     this.author = author; 
    } 

    public String getSubredditNamePrefixed() 
    { 
     return subredditNamePrefixed; 
    } 

    public void setSubredditNamePrefixed(String subredditNamePrefixed) 
    { 
     this.subredditNamePrefixed = subredditNamePrefixed; 
    } 

    public String getUrl() 
    { 
     return url; 
    } 

    public void setUrl(String url) 
    { 
     this.url = url; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 

    public void setTitle(String title) 
    { 
     this.title = title; 
    } 


} 

答えて

0

(第1 response.isSuccessful()を確認してください)

0

問題は、あなたのデータはRedditにJSONに対応していないということです。

{ 
    "kind":"listing", 
    "data":{ 
    "modhash":"...", 
    "children":[...], 
    "after":"...", 
    "before":"..." 
    } 
} 

レトロフィット自動的にJSONからJavaへの変換が、マッピングが正しい場合にのみ:あなたのデータクラス

public class Data { 
    private List<Child> children = null; 
} 

はある与えられたJSON、で一致していません。

public class Subreddit { 
    String kind; 
    Data data; 
} 

public class Data{ 
    String modhash; 
    List<Child> children; 
    String after; 
    String before; 
} 

、その後、あなたは右のマッピングを取得するためにJSONの全体の深さのために再帰的に行かなければならないだろう

Call<Subreddit> desks(); 

に机のメソッドインタフェースを変更します。 正しいJavaクラスは次のようになります。 しかし、あなたが仕事を得る前に、ちょうどあなたのレトロフィット・インタフェースに置き換えますと

public interface DeskInterface{ 
    @GET("battlestations/hot/.json") 
    Call<Data> desks(); 
} 

を:

public interface DeskInterface{ 
    @GET("battlestations/hot/.json") 
    Call<JsonObject> desks(); 
} 

、それが何かを返す必要があります。まだnullの場合は、さらに調査が必要です。有効な応答(何らかのjsonテキスト)が返された場合は、そのサブディレクトリをコピーしてthis websiteに貼り付け、すべてのjsonを有効なJavaクラスに変換します

関連する問題