我正在做一个Dagger研究项目,我是基于我在git中发现的一些其他项目来做这个项目的,我在一个课上遇到了一个问题。
该项目是关于读取和提交git存储库的,它在不使用MVP和Dagger的情况下开始工作,但我正在重构它以使用这些特性。
RepositoriesPPreseInterimpl类扩展了BasePresenter,后者又有一个BaseView类型的视图(iRespositoriesPopMVPView也有一个扩展,即BaseView),该类有一个getView方法,该方法访问控制视图中某些函数的方法,考虑到MVP概念的需要。
问题是,在RepositoriesPPreseInterimpl中,当我调用getView时,它是空的,当我调试时,我看到视图是真的空的,但我不明白为什么。这个项目还有很多其他的课程,如果有人能帮助我,我会在这里发布与这个问题相关的课程。
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();
}
}
基本视图
public interface BaseView {
}
IRepositoriePopMVPView扩展了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扩展了BaseFragment并实现了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();
}
}
基地主持人
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);
}
}
RepositoriesPopPresenter Impl扩展BasePresenter
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: 無法恢復活動 {gitrepopop/gitrepopop.最有价值球员。Main.MainActivity}: java.lang.NullPointerException: Try to invoke interface method 'void gitrepopop.最有价值球员。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) atandroid.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) Cause by: java.lang.NullPointerException: Try to invoke interface method 'void gitrepopop.最有价值球员。Repositorie.IRepositoriePopMVPView.onShowProgress(java.lang.String)' on a null object reference at gitrepopop.最有价值球员。Repositorie.RepositoriesPopPresenterImpl.getRepositories(RepositoriesPopPresenterImpl.java:27) at gitrepopop.最有价值球员。Repositorie.RepositoriesPopFragment.onViewReady(RepositoriesPopFragment.java:69) at gitrepopop.最有价值球员。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)
但是RepositoriesPopPresentImpl扩展了具有通用.的BasePresenter。因为IRepositoriePopMVPView从BaseView扩展,这意味着BasePresenter的getView方法访问的视图是我的片段,RepositoriesPopFraank。您在另一个主题中解释的方式,我应该在RepositoriesPopPresentImpl构造函数中作为参数传递。
我会使用java泛型!我用这两个资源库作为研究:http://github.com/filippella/Dagger-Rx-Database-MVP http://github . com/MindorksOpenSource/Android-MVP-architecture
我有这个存储库接口: 这个控制器: 现在,当我调用<code>/retrieve stats</code>并进入<code>gameService时。retrieveStatsForUser我得到一个空指针异常 这是否意味着bean没有实例化?这应该发生在@Autowired构造函数中,对吗?很好地实例化了。发生了什么?
本文向大家介绍SQL中的视图和实例化视图之间的区别,包括了SQL中的视图和实例化视图之间的区别的使用技巧和注意事项,需要的朋友参考一下 我们知道任何数据库的主要组成部分都是它的表,为了使数据可访问性自定义,有了视图的概念,换句话说,我们可以说借助表的视图,我们可以限制任何用户仅访问该数据应该由他访问。现在,基于视图的特征和特征,我们可以区分视图和实体化视图。 以下是视图和实例化视图之间的重要区别。
问题内容: 我的模块类中有一组and 方法,目的是在整个应用程序中创建Singleton实例。一切工作正常,除了少数瓶颈情况,如下所示: 步骤1.我正在使用其中的Auth令牌创建一个Retrofit实例,以每次进行经过身份验证的api调用(通过来处理Auth令牌的检索和插入)。但是问题出在我通过清除数据库和共享的首选项值注销应用程序后重新启动活动时。 步骤2。注销后,正在提出另一个请求以获取身份验
实体化视图是模式对象,可以用来总结、计算、复制和分发数据。在主窗口中,点击 “实体化视图”来打开实体化视图的对象列表。 你可以创建一个实体化视图快捷方式,右击对象选项卡的实体化视图并在弹出式菜单中选择“创建打开实体化视图快捷方式”。此选项让你快速直接地打开实体化视图,而无需打开 Navicat 主窗口。 若要重整并完全替换实体化视图的内容,右击对象选项卡中的实体化视图并在弹出式菜单中选择“刷新实体
实体化视图是模式对象,可以用来总结、计算、复制和分发数据。在主窗口中,点击 “实体化视图”来打开实体化视图的对象列表。 你可以创建一个实体化视图快捷方式,右击对象选项卡的实体化视图并在弹出式菜单中选择“创建打开实体化视图快捷方式”。此选项让你快速直接地打开实体化视图,而无需打开 Navicat 主窗口。 若要刷新实体化视图,右击对象选项卡中的实体化视图并在弹出式菜单中选择“刷新实体化视图”。 实体
实体化视图是模式对象,可以用来总结、计算、复制和分发数据。在主窗口中,点击 “实体化视图”来打开实体化视图的对象列表。 你可以拖出实体化视图以创建一个实体化视图快捷方式。这个快捷方式让你快速直接地打开实体化视图,而无需打开 Navicat 主窗口。 若要重整并完全替换实体化视图的内容,按住 Control 键并点按在对象选项卡中的实体化视图,然后在弹出式菜单中选择“刷新实体化视图与”->“数据”或