robię Retrofita z wykorzystaniem RxJavy zgodnie z tym filmem i jak się pewnie domyślacie, nie działa mi XD
nie wiem co mogę zrobić, aby naprawić ten błąd, bo za każdym razem jak poprawiam jakiś, to w jego miejsce pojawiają się kolejne
jest to mój pierwszy jakikolwiek projekt w Javie, więc liczę na waszą wyrozumiałość :D
wiem, że metoda getMovie()
jest pusta i chyba przez to wyrzuca ten błąd, no ale jednak w tym filmiku też ten typek nic nie wpisał w tej metodzie, a jednak mu działa XD
tutaj link do całości repo, bo GitHub odrzuca z powodu zbyt dużego rozmiaru pliku :/
stacktrace:
FATAL EXCEPTION: main
Process: com.example.mainactivity, PID: 6483
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mainactivity/com.example.mainactivity.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
at com.example.mainactivity.MainActivity.fetchData(MainActivity.java:53)
at com.example.mainactivity.MainActivity.onCreate(MainActivity.java:49)
at android.app.Activity.performCreate(Activity.java:8305)
at android.app.Activity.performCreate(Activity.java:8284)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
MyAPI.java:
import com.example.mainactivity.model.Movie;
import java.util.List;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
public interface MyAPI {
@GET("http://localhost:8080/api/v1/movies/")
Observable<List<Movie>> getMovie();
}
MainActivity.java:
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.mainactivity.adapter.MovieAdapter;
import com.example.mainactivity.model.Movie;
import com.example.mainactivity.retrofit.MyAPI;
import com.example.mainactivity.retrofit.RetrofitClient;
import java.util.List;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
public class MainActivity extends AppCompatActivity {
MyAPI myAPI;
RecyclerView recycler_movie;
CompositeDisposable compositeDisposable = new CompositeDisposable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Init API
//Retrofit retrofit = RetrofitClient.getInstance();
//myAPI = retrofit.create(MyAPI.class);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:8080/api/v1/movies/")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//View
recycler_movie = (RecyclerView)findViewById(R.id.recycler_movie);
recycler_movie.setHasFixedSize(true);
recycler_movie.setLayoutManager(new LinearLayoutManager(this));
fetchData();
}
private void fetchData() {
compositeDisposable.add(myAPI.getMovie()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<Movie>>() {
@Override
public void accept(List<Movie> movies) throws Throwable {
displayData(movies);
}
}));
}
private void displayData(List<Movie> movies) {
MovieAdapter adapter = new MovieAdapter(this, movies);
recycler_movie.setAdapter(adapter);
}
@Override
protected void onStop() {
compositeDisposable.clear();
super.onStop();
}
}