Reputation: 192
I'm doing a Dagger study project and I'm doing this based on some other projects I found in git, I'm having a problem in a class.
The project is about reading and submitting git repositories, it came to work without using MVP and Dagger but I'm refactoring it to use these features.
The RepositoriesPopPresenterImpl class that extends a BasePresenter which in turn has a View that is of BaseView type (IRepositoriePopMVPView also has an extend that is BaseView) has a getView method that accesses the methods that control some functions in the View, account of the needs of the MVP concept.
The problem is that in the RepositoriesPopPresenterImpl when I call the getView is speaking that this null, when I debug I saw that the View is really null but I can not understand why. The project has many other classes and I will post here the ones that are related to the problem, if anyone can help me.
DIRepositorieModulo
@Module
public class DIRepositorieModulo {
private IRepositoriePopMVPView mView;
private RepositoriesPopPopAdapter mAdapter;
public DIRepositorieModulo(IRepositoriePopMVPView view, RepositoriesPopPopAdapter adapter) {
this.mView = view;
this.mAdapter = adapter;
}
@PerActivityScope
@Provides
IRepositorieAPI provideApiServiceRepositorie(Retrofit retrofit){
return retrofit.create(IRepositorieAPI.class);
}
@PerActivityScope
@Provides
IRepositoriePopMVPView provideView(){
return mView;
}
@PerActivityScope
@Provides
IRepositoriePopAdapterMVPModel provideRepositorieAdapterMVPModel(){
return mAdapter;
}
@PerActivityScope
@Provides
IRepositoriePopAdapterMVPView provideRepositorieAdapterMVPView(){
return mAdapter;
}
@PerActivityScope
@Provides
RepositoriesPopPresenterImpl provideRepositoriePresenter(){
return new RepositoriesPopPresenterImpl();
}
}
BaseView
public interface BaseView {
}
IRepositoriePopMVPView extends BaseView
public interface IRepositoriePopMVPView extends BaseView {
void listRepositories(List<Item> listItem);
void checkedUnCheckedRepoFavorite();
void onShowMessage(String message);
void callDetailRepositorie(Item item);
void onHideMessage();
void onShowProgress(String message);
void onHideProgress();
void onShowToast(String message);
void refresh();
}
RepositoriesPopFragment extends BaseFragment implements IRepositoriePopMVPView
public class RepositoriesPopFragment extends BaseFragment implements IRepositoriePopMVPView {
public static final String FRAG_POP = "fragPop";
private Unbinder mUnbinder;
@BindView(R.id.rv_pop_repo_java)
protected RecyclerView mRecyclerRepositories;
protected RepositoriesPopPopAdapter mAdapter;
@Inject
protected IRepositoriePopAdapterMVPView mAdapterView;
@Inject
protected RepositoriesPopPresenterImpl mPresenter;
private View view = null;
@Override
protected void onViewReady(Bundle savedInstanceState, Intent intent) {
super.onViewReady(savedInstanceState, intent);
initializeRecyclerRepositorie();
mPresenter.getRepositories();
}
private void initializeRecyclerRepositorie() {
mRecyclerRepositories.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getContext());
llm.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerRepositories.setLayoutManager(llm);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(view==null){
view = inflater.inflate(R.layout.fragment_pop_repo_java, container, false);
}
mUnbinder = ButterKnife.bind(this, view);
return view;
}
@Override
public void onDestroy() {
super.onDestroy();
mUnbinder.unbind();
}
@Override
protected void resolverDaggerDependecy() {
mAdapter = new RepositoriesPopPopAdapter(getContext());
DaggerDIRepositorieComponent
.builder()
.dIRepositorieModulo(new DIRepositorieModulo(this, mAdapter))
.dIApplicationComponent(getApplicationComponent())
.build().injectFragment(this);
}
@Override
public void listRepositories(List<Item> listItem) {
Log.i("app", "RepositoriesPopFragment - listRepositories - listItem Size" + listItem.size());
mRecyclerRepositories.setAdapter(mAdapter);
mAdapter.setListRepositore(listItem);
}
@Override
public void callDetailRepositorie(Item item) {
Toast.makeText(getContext(), "NOME " + item.getName(), Toast.LENGTH_SHORT).show();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailRepositoriesFragment frag = new DetailRepositoriesFragment(item.getOwner().getLogin(), item.getName());
fragmentTransaction.replace(R.id.container_fragment, frag, DetailRepositoriesFragment.FRAG_DETAIL_REPO);
fragmentTransaction.addToBackStack(DetailRepositoriesFragment.FRAG_DETAIL_REPO);
fragmentTransaction.commit();
}
@Override
public void checkedUnCheckedRepoFavorite() {
}
@Override
public void onHideMessage() {
hideMessage();
}
@Override
public void onShowProgress(String message) {
if(message!=null || !message.isEmpty()){
showProgress(message);
}
}
@Override
public void onHideProgress() {
hideProgress();
}
@Override
public void onShowMessage(String message) {
showMessage(message);
}
@Override
public void onShowToast(String message) {
showToast(message);
}
@Override
public void refresh() {
mAdapterView.refresh();
}
}
BasePresenter < V extends BaseView >
public class BasePresenter<V extends BaseView> {
@Inject
protected V mView;
//Fornece a View para realizar as operações do MVP
protected V getView() {
return mView;
}
protected <T> void subscribe(Observable<T> observable, Observer<T> observer){
observable.subscribeOn(Schedulers.newThread())
.toSingle()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
RepositoriesPopPresenterImpl extends BasePresenter < IRepositoriePopMVPView >
public class RepositoriesPopPresenterImpl extends BasePresenter<IRepositoriePopMVPView> implements Observer<Repositories>{
@Inject
protected IRepositorieAPI mApiService;
@Inject
public RepositoriesPopPresenterImpl(){
}
public void getRepositories() {
getView().onShowProgress("Carregando Repositórios");
Observable<Repositories> repositoriesObservable = mApiService.getAllRepositories();
subscribe(repositoriesObservable, this);
}
//Todo: Methods implementation of Observer<Repositories>
@Override
public void onCompleted() {
getView().onHideProgress();
getView().onShowToast("Repositórios carregados!");
}
@Override
public void onError(Throwable e) {
getView().onHideProgress();
getView().onHideMessage();
getView().onShowMessage("Não foi possível carregar os Repositórios");
}
@Override
public void onNext(Repositories repositories) {
List<Item> listItem = repositories.getItems();
if(listItem!=null){
getView().listRepositories(repositories.getItems());
}else{
getView().onShowMessage("Não foi possível carregar os Repositórios");
}
}
}
10-23 15:45:05.772 1972-1972/gitrepopop E/AndroidRuntime: FATAL EXCEPTION: main Process: gitrepopop, PID: 1972 java.lang.RuntimeException: Unable to resume activity {gitrepopop/gitrepopop.MVP.Main.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void gitrepopop.MVP.Repositorie.IRepositoriePopMVPView.onShowProgress(java.lang.String)' on a null object reference at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3469) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3509) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:153) at android.app.ActivityThread.main(ActivityThread.java:6237) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786) Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void gitrepopop.MVP.Repositorie.IRepositoriePopMVPView.onShowProgress(java.lang.String)' on a null object reference at gitrepopop.MVP.Repositorie.RepositoriesPopPresenterImpl.getRepositories(RepositoriesPopPresenterImpl.java:27) at gitrepopop.MVP.Repositorie.RepositoriesPopFragment.onViewReady(RepositoriesPopFragment.java:69) at gitrepopop.MVP.BaseFragment.onViewCreated(BaseFragment.java:36) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1314) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013) at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:499) at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172) at android.app.Activity.performResume(Activity.java:6812) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3446) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3509) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:153) at android.app.ActivityThread.main(ActivityThread.java:6237) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)
Upvotes: 0
Views: 76
Reputation: 192
But RepositoriesPopPresenterImpl, extends BasePresenter that has a Generic of . as IRepositoriePopMVPView extends from BaseView it means that the getView method of BasePresenter accesses the view of the which is my Fragment, RepositoriesPopFragment. The way you explained in the other topic I should pass as a parameter in the RepositoriesPopPresenterImpl constructor.
I would use java generic! I use these two repositories as a study: http://github.com/filippella/Dagger-Rx-Database-MVP http://github.com/MindorksOpenSource/android-mvp-architecture
Upvotes: 0