2016-04-06 8 views
0

私はRetrofit APIを初めて使用しています。私はthe tutorial on Vogellaに続き、StackExchangeからデータを取得してリストビューで表示することができました。しかし、私がTMDBからデータを取得しようとすると、以下のエラーが表示されます。ここで改造APIの問題に直面しています。エラー:java.lang.NullPointerException:nullオブジェクト参照でインタフェースメソッドを呼び出そうとしました

java.lang.NullPointerException: Attempt to invoke interface method 
    'java.lang.Object[] java.util.Collection.toArray()' on a null object reference, 

(これは正常に動作している)リストビューでStackExchangeのURLから「タイトル」を表示するためのコードです。

MainActivity

public class MainActivity extends ListActivity implements Callback<StackOverflowQuestion> { 

    ArrayAdapter<Question> madapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     madapter=new ArrayAdapter<Question>(this,android.R.layout.simple_list_item_1,android.R.id.text1,new ArrayList<Question>()); 
     setListAdapter(madapter); 
     Retrofit retrofit= new Retrofit.Builder() 
      .baseUrl("http://api.stackexchange.com") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
     StackOvreflowAPI stackOverflowAPI = retrofit.create(StackOvreflowAPI.class); 

     Call<StackOverflowQuestion> call = stackOverflowAPI.load(); 
     call.enqueue(this); 
    } 

    @Override 
    public void onResponse(Response<StackOverflowQuestion> response, Retrofit retrofit) { 

     ArrayAdapter<Question> adapter = (ArrayAdapter<Question>) getListAdapter(); 
     adapter.clear(); 
     adapter.addAll(response.body().items); 
    } 

    @Override 
    public void onFailure(Throwable t) { 

    } 
} 

Modelクラス:質問

public class Question { 
    public String name; 

    @Override 
    public String toString() { 
     return (name); 
    } 
} 

StackOverflowQuestion

public class StackOverflowQuestion { 
    List<Question> items; 
} 

StackOverflowAPI

public interface StackOvreflowAPI { 
    @GET("/2.2/questions?order=desc&sort=activity&tagged=android&site=stackoverflow") 
    Call<StackOverflowQuestion> load(); 
} 

しかし、私はTMDBのURLからoverviewを取得するために同じコードを使用するとき、私はエラーを取得:

java.lang.NullPointerException: Attempt to invoke interface method  
    'java.lang.Object[] java.util.Collection.toArray()' on a null object reference. 

私はURL、インタフェースおよび変更モデルクラス。 MainActivityで行われた

変更:.baseUrl("https://api.themoviedb.org")の代わり.baseUrl("https://api.stackexchange.com")を使用して

Retrofit retrofit= new Retrofit.Builder() 
      .baseUrl("https://api.themoviedb.org") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

。インターフェイスで行われた

変更:

public interface StackOvreflowAPI { 
    @GET("/3/movie/popular?api_key=ab5aee0b18da89dd9e026d35754c24f1") 
    Call<StackOverflowQuestion> load(); 
} 

@GET("/3/movie/popular?api_key=ab5aee0b18da89dd9e026d35754c24f1")を使用する代わりに、質問のクラスで行われた@GET("/2.2/questions?order=desc&sort=activity&tagged=android&site=stackoverflow")

変更の:

public class Question { 
    public String overview; 

    @Override 
    public String toString() { 
     return (overview); 
    } 
} 

はにtitleを変更します。

しかしエラーでアプリがクラッシュし、これを実行するには:

FATAL EXCEPTION: main 
    Process: com.example.maver_000.practise_retrofit, PID: 4270 
    java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference 
    at java.util.ArrayList.addAll(ArrayList.java:188) 
    at android.widget.ArrayAdapter.addAll(ArrayAdapter.java:195) 
    at com.example.maver_000.practise_retrofit.MainActivity.onResponse(MainActivity.java:40) 
    at retrofit.ExecutorCallAdapterFactory$ExecutorCallback$1.run(ExecutorCallAdapterFactory.java:86) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5294) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
+0

を動作するはずです、結果にごStackOverFlowQuestionクラスの変数名を変更するか、JSON名と一致するように@SerializedNameを追加し、APIレスポンスでお探しですか?これを行うには、call.isSuccessfulをチェックしてください。 –

+0

これはonresponseメソッドを実行します – jaguar

+0

stacktraceを印刷できますか? –

答えて

1

がTMDB APIによって返された応答構造を確認し、私はのようGson変換、「概要」は、直接ルートオブジェクトではないかもしれないと思います応答が失敗する可能性があります。

API呼び出しが成功した場合は、確認することができ、それは

+0

変数項目に@SerializedName( "results")を追加しました。今働いている。ありがとう、トン。 – jaguar

関連する問題