私は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)
を動作するはずです、結果にごStackOverFlowQuestionクラスの変数名を変更するか、JSON名と一致するように@SerializedNameを追加し、APIレスポンスでお探しですか?これを行うには、call.isSuccessfulをチェックしてください。 –
これはonresponseメソッドを実行します – jaguar
stacktraceを印刷できますか? –