2016-06-28 4 views
0

ですが、私はからデータを取得しようとしていますレトロフィット2:次のコードを使用して</p> <pre><code>https://api.stackexchange.com/2.2/questions?order=desc&sort=creation&site=stackoverflow&tagged=android </code></pre> <p>::response.body()がnullであるが、ステータスコードが、私はなぜこれが起こっているかわからない200

public interface StackOverflowAPI { 

    @GET("/2.2/questions?order=desc&sort=creation&site=stackoverflow") 
    Call<StackQuestions> loadQuestions(@Query("tagged") String tags); 

} 

とクラス:

public class StackQuestion { 

    @SerializedName("title") 
    private String title; 

    @SerializedName("view_count") 
    private int numViews; 

    @SerializedName("is_answered") 
    private boolean solved; 


    public String getTitle() { 
     return title; 
    } 

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

    public int getNumViews() { 
     return numViews; 
    } 

    public void setNumViews(int numViews) { 
     this.numViews = numViews; 
    } 

    public boolean isSolved() { 
     return solved; 
    } 

    public void setSolved(boolean solved) { 
     this.solved = solved; 
    } 

} 


public class StackQuestions { 
    List<StackQuestion> questions; 
} 

フラグメント:

、次

compile 'com.google.code.gson:gson:2.7' 
compile 'com.android.support:design:24.0.0' 
compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.android.support:cardview-v7:24.0.0' 
compile 'com.android.support:appcompat-v7:24.0.0' 
compile 'com.android.support:recyclerview-v7:24.0.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1' 

コードを実行した後、私はlogcatに持っている:

public class AlphaFragment extends Fragment implements Callback<StackQuestions> { 

    private StackOverflowAPI stackOverflowAPI; 

    private EditText etxtQuestionToSearch; 
    private Button  btnSearchQuestion; 

    private RecyclerView    mRecyclerView; 
    private RecyclerView.Adapter  mStackQuestionsAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 

    private ArrayList<StackQuestion> mStackQuestionsList; 

    private final static String TAG = "AlphaFragment"; 

    public AlphaFragment() {} 


    // ------------------------ FRAGMENT LIFECYCLE ------------------------ // 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     init(); 
    } // end : onCreate Method 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_alpha, container, false); 

     etxtQuestionToSearch = (EditText) view.findViewById(R.id.etxt_stack_topic); 
     btnSearchQuestion = (Button) view.findViewById(R.id.button_stack_search); 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.rcvw_stackquestions_list); 

     // Recycler View SETUP 
     mLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

     btnSearchQuestion.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       searchStackQuestion(); 
      } // end : onClick Method 
     }); 

     return view; 
    } // end : onCreateView Method 


    // ------------------------- CALLBACK METHODS ------------------------- // 

    @Override 
    public void onResponse(Call<StackQuestions> call, 
          Response<StackQuestions> response) { 
     if (response == null) { 
      return; 
     } 

     List<StackQuestion> resultList = response.body().questions; 

     // X:ERROR: .questions == NULL, so Toast appears 
     if (resultList == null || resultList.isEmpty()) { 
      Toast.makeText(getActivity(), "Results for the query are null/empty", Toast.LENGTH_LONG).show(); 
      return; 
     } 

     // Add resulting data from web service 
     for (StackQuestion question : resultList) { 
      mStackQuestionsList.add(question); 
     } 

     // Assign data to recycler view 
     mStackQuestionsAdapter = new StackQuestionsAdapter(
      mStackQuestionsList, 
      getActivity(), 
      new RVTapListener() { 
       @Override 
       public void onItemClick(View v, int position) { 
        Toast.makeText(getActivity(), "Now clicked, but not implemented " + new Date(), Toast.LENGTH_SHORT).show(); 
       } // end : onItemClick Method 
      } 
     ); 
     mRecyclerView.setAdapter(mStackQuestionsAdapter); 
    } // end : onResponse Method 

    @Override 
    public void onFailure(Call<StackQuestions> call, 
          Throwable t) { 
     Toast.makeText(getActivity(), t.getLocalizedMessage(), Toast.LENGTH_LONG).show(); 
    } // end : onFailure Method 


    // ------------------------- FRAGMENT METHODS ------------------------- // 

    private void init() { 
     Gson gson = new GsonBuilder() 
      .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
      .create(); 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

     Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("https://api.stackexchange.com") 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .client(client) 
      .build(); 

     stackOverflowAPI = retrofit.create(StackOverflowAPI.class); 
    } // end : init Method 

    private void searchStackQuestion() { 
     mStackQuestionsList = new ArrayList<>(); 

     Call<StackQuestions> call = stackOverflowAPI.loadQuestions("android"); 
     call.enqueue(this); 
    } // end : searchStackQuestion Method 

}  

Gradleの依存関係

D/OkHttp: <-- 200 OK https://api.stackexchange.com/2.2/questions?order=desc&sort=creation&site=stackoverflow&tagged=android (1136ms) 
D/OkHttp: Cache-Control: private 
D/OkHttp: Content-Type: application/json; charset=utf-8 
D/OkHttp: Access-Control-Allow-Origin: * 
D/OkHttp: Access-Control-Allow-Methods: GET, POST 
D/OkHttp: Access-Control-Allow-Credentials: false 
D/OkHttp: X-Content-Type-Options: nosniff 
D/OkHttp: Date: Tue, 28 Jun 2016 22:56:26 GMT 
D/OkHttp: {"items":[{"tags":["android"],"owner":{"reputation":1,"user_id" ... 
D/OkHttp: er_id":1163471,"user_type":"registered","accept_rate":93,"profil ... 
D/OkHttp: e?type=large","display_name":"Vahid Zadeh","link":"http://stacko ... 
D/OkHttp: n_id":38086882,"link":"stackoverflow.com/questions/380868 ... 
D/OkHttp: ","animation-listener"],"owner":{"reputation":23,"user_id":43462 ... 
D/OkHttp: <-- END HTTP (19295-byte body) 

すべてがうまく行くのですが、私は、この部分でNullPointerExceptionが取得しますAlphaFragments:

List<StackQuestion> resultList = response.body().questions; 

// X:ERROR: .questions == NULL, so Toast appears 
if (resultList == null || resultList.isEmpty()) { 
    Toast.makeText(getActivity(), "Results for the query are null/empty", Toast.LENGTH_LONG).show(); 
    return; 
} 

何が問題なのですか? status code200があります。そこにJSON情報があります。検索すると、NPEが表示されます。

ありがとうございます...

+0

郵便配達やhurlit @Nelsonでの応答は何ですか? – Lampard

答えて

1

私はあなたのモデルに間違いがあると思います。

試してみてください。

public class StackQuestions { 
    @SerializedName("items") 
    List<StackQuestion> questions; 
} 
+0

ありがとうございます、この後、動作します。 – Nelson

0

レトロフィットはとても成功し、あなたが同じ階層でモデルを定義する必要がJSONを解析するために、JSONを解析するために、デフォルトでgsonを使用しています。

私はこのような何かがうまくいくと思います:

public class StackQuestions { 
    private List<StackQuestion> items; 

    public void setItems(List<StackQuestion> items){ 
     this.items = items; 
    } 
    public List<StackQuestions> getItems(){ 
     return this.items; 
    } 
} 


public class StackQuestion{ 
    private Owner owner; 

    public void setOwner(Owner owner){ 
     this.owner = owner; 
    } 
    public Owner getOwner(){ 
     return this.owner; 
    } 
} 


public class Owner { 

    @SerializedName("title") 
    private String title; 

    @SerializedName("view_count") 
    private int numViews; 

    @SerializedName("is_answered") 
    private boolean solved; 


    public String getTitle() { 
     return title; 
    } 

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

    public int getNumViews() { 
     return numViews; 
    } 

    public void setNumViews(int numViews) { 
     this.numViews = numViews; 
    } 

    public boolean isSolved() { 
     return solved; 
    } 

    public void setSolved(boolean solved) { 
     this.solved = solved; 
    } 

} 
+0

私は同じ問題を抱えています(応答コードはnullですが、私のokHTTP logcatでJSONレコードを見ることができます)。残りのAPI(googlemapsのタイムゾーン)には、オブジェクトにロードするアイテムが1つしかなく、そのアイテムには5つのフィールドしかありません。つまり、配列やリストは必要ありません。オブジェクトからモデルを作成する方法を理解できないので、APIからデータを取得します。私はLISTを使用する別のAPIのためにこれをすべて動作させています。しかし、このGoogle(非リスト)APIで私はモデルを理解することはできません。助けて! –

関連する問題

 関連する問題