我正在开发一个显示列表的小应用程序,当单击某个项目时,它会打开一个包含项目详细信息的辅助屏幕.我想实现MVP作为我的应用程序的架构,当我有一个包含2个片段的单个活动时,我一直在努力弄清楚如何做到这一点.
有些问题出现了,当点击列表中的项目时,会向第一个演示者发送回调,但此时,谁负责打开第二个片段?让主持人"互相交谈"?我应该通过活动吗?
一直在寻找具有实现MVP的多个片段的单个活动的示例,但是还找不到类似的东西.
(是的,它可以以其他方式完成,但应用程序的目的是学习在具有多个片段的单个活动上实施MVP)
感谢任何帮助!谢谢!
为了在Android上使用mvp模式实现"干净"架构,建议将android框架视为插件,而不是将任何知识产权感知依赖项泄漏到演示者层.使用rxjava,如果我有一个用于将数据"推送"到视图层的演示者,我可能希望有这样的逻辑:
public interface SearchPresenter {
interface ViewLayer {
void updateResults(List<SearchResult> searchResults)
}
void bind(ViewLayer viewLayer);
void unbind();
}
public class SearchPresenterImpl implements SearchPresenter {
ViewLayer viewLayer;
CompositeDisposable compositeDisposable;
@Override
public void bind(ViewLayer viewLayer) {
this.viewLayer = viewLayer;
compositeDisposable = new CompositeDisposable();
compositeDisposable.add(
searchInteractor.getSearchResults()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::refreshView));
}
private void refreshView(List<SearchResult> searchResults) {
//send the results back to the view layer to update a RecyclerView
viewLayer.updateResults(searchResults)
}
@Override
public void unbind() {
compositeDisposable.dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是,通过观察'AndroidSchedulers.mainThread()',这会强制依赖于:
import io.reactivex.android.schedulers.AndroidSchedulers
Run Code Online (Sandbox Code Playgroud)
在这一点上,我的主持人现在知道android并且与之相关; 我想避免.
处理这个的建议方法是什么,以保证结果在Android的UI(主)线程上传递给ViewLayer,而演示者维护没有任何与Android相关的依赖?
我有一个使用 MVP 架构构建的 Android 项目。我不太确定的一件事是,当我想在单击按钮后导航到另一个活动时,我应该放置
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)
在视图组件内部还是在Presenter组件内部?
我正在开发一个由3个主要部分组成的Android测试项目,每个部分都是按照MVP模式开发的.这些部分互相嵌套,我想知道我所遵循的策略是否正确/最好
结构体:
每个部分都使用MVP结构(例如,对于Book I制作了BookPresenter,BookView和BookModel,对于Page和Item也是如此)
作为用户案例,我想跟踪用户点击按钮的次数,并且每次将页面背景更改为随机颜色,当用户到达第10次点击时,告诉BookPresenter转到第二页.
为此我设置了这样的东西
在所有这些中,BookPresenter具有对PagePresenter的引用,并且PagePresenter具有对ItemPresenter的引用,因此当需要执行某些操作时,它们可以与结构中的子或父呈现器进行通信.
现在的问题 是:这是建立具有嵌套MVP的系统的正确方法吗?因为如果我想要一个PageView而不是在Book中我需要将它放在一个Newspaper(其他具有Book的替代行为的类)中,我仍然需要使用Presenters和其他所有其他类重新创建依赖关系链. ...
我正在开发一个新的Android应用程序,我想适当地组织所有组件-网络调用类,JSON解析类等。我正在使用Okhttp进行网络通话;经过大量研究,我能够像这样构造我的代码:
我的NetworkUtil类:
public class NetworkUtil {
public static void getData(String url, final OkHttpListener listener){
OkHttpClient client = new OkHttpClient();
// GET request
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
listener.onFailure(request, e);
}
@Override
public void onResponse(Response response) throws IOException {
listener.onResponse(response);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我的网络回调接口:
public interface OkHttpListener {
void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;
}
Run Code Online (Sandbox Code Playgroud)
这是我的Activity类:
OkHttpListener listener = new OkHttpListener() {
@Override
public …Run Code Online (Sandbox Code Playgroud) 我目前正在为每个屏幕使用片段的单个活动应用程序中工作。我也在使用 MVP 设计模式。
语境
我想要的是?
如何将 Fragment-A 作为侦听器传递给 DialogFragment (Fragment-B),以便我可以从 DialogFragment 调用操作?
android android-fragments android-dialogfragment android-mvp
我为我的 Activity 和 Fragment、Presenter、ViewHolder 和 ViewModel 定义了几个基类,并定义了一个接口和 Presenter,继承这些基类的所有其他活动,在我的 BaseActivity 类和 BaseFragmentClass 中,我正在创建对象lifecycleRegistry和正在初始化它,但是当应用程序启动时,它会因错误而崩溃getLifecycle() returned null in ComponentActivity's constructor. Please make sure you are lazily constructing your Lifecycle in the first call to getLifecycle() rather than relying on field initialization.
文件:BaseFragment.java
package com.example.myapp.data.helper.base;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelProviders;
public abstract class BaseFragment<V extends MvpView, …Run Code Online (Sandbox Code Playgroud) 我正在使用 Android Dagger2,但收到以下错误。\n我的 AppModule 类是:
\n\n@Module\npublic class AppModule {\n\nRetrofitExample retrofitExample;\n\nAppModule(RetrofitExample retrofitExample) {\n\n this.retrofitExample = retrofitExample;\n\n}\n\n@Singleton\n@Provides\nRetrofitExample provideApplication() {\n return retrofitExample;\n}\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我的API模块类
\n\n@Module\nclass ApiModule {\n\nString BaseUrl;\n\nprivate MainActivity mainActivity;\n\nApiModule(String baseUrl) {\n this.BaseUrl = baseUrl;\n}\n\n\npublic ApiModule(MainActivity downloadFileView) {\n this.mainActivity = downloadFileView;\n}\n@Provides\n@Singleton\nGson provideGson() {\n GsonBuilder gsonBuilder = new GsonBuilder();\n gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);\n return gsonBuilder.create();\n}\n\n@Provides\n@Singleton\nOkHttpClient provideOkhttpClient(Cache cache) {\n OkHttpClient.Builder client = new OkHttpClient.Builder();\n client.cache(cache);\n return client.build();\n}\n\n@Singleton\n@Provides\nRetrofit providesRetrofit(Gson gson, OkHttpClient okHttpClient) {\n return new Retrofit.Builder()\n .addConverterFactory(GsonConverterFactory.create(gson))\n .baseUrl(BaseUrl)\n .client(okHttpClient)\n .build();\n}\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我的 API 组件类。
\n\nvoid inject(MainActivity …Run Code Online (Sandbox Code Playgroud) 我想了解dagger2并在我的应用程序中实现.我已经阅读了很多关于它的好处.除非我完全理解,否则我无法在我的应用中获得它的好处.
我已经理解了@Module和@Inject.令我困惑的是@Component.我几乎没有相关的问题.
Module提供对象实例,Inject使用它.为什么我们之间需要组件?是否真的有必要缩小差距?我们可以使用没有任何方法的空接口组件吗?
构造函数对于模块类是否真的必要?如果模块类中没有构造函数,我们可以使用空构造函数初始化模块类吗?
为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它?
到目前为止,我在组件接口中只看到了两种方法
一个.void inject(活动/服务/片段); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -
void inject(); - 组件是否仍会生成依赖图?
我们可以从活动或服务以外的其他类注入或者像这样的片段 -
void inject(DataManager dataManager);
如果DataManager是单例实例怎么办?
湾 改造getRetrofit(); 这种方法和上面的方法有什么区别?为什么不采用任何输入参数?
我读到@Singleton只是匕首的范围.我们怎样才能真正创建一个在应用程序的生命周期内存在的单例对象?
假设我想使用dagger构建一个DataManager实例.它只有一个依赖.我为此编写了一个模块类和一个组件接口.如果我想在MainActivity中使用它,我会用它作为
@Inject DataManager dataManager;
...
@覆盖
protected void onCreate(Bundle savedInstanceState){
DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();
}
我想在许多其他活动中使用这个数据管理器,我不希望它是单例.我想将它保持在我使用它的当前活动范围.所以我会用
@Inject DataManager dataManager;
得到那个实例.我应该写
DataManagerComponent.Builder...........
Run Code Online (Sandbox Code Playgroud)
在每个活动oncreate()我使用@Inject DataManager dataManager?如果我必须写它,它不会创建更多的样板代码而不是简单地使用
DataManager dataManager = new DataManager();
假设有4个对象,它们相互依赖,如D依赖于C,C依赖于B等.
D - > C - > B - > A.
让我们假设我已经编写了模块类并为所有4提供了方法.如果我尝试在任何ActivityA中注入D
@Inject D d;
C,B,A会自动实例化吗?
让我们假设在ActivityB中我只需要注入B.如果我注入B就好了
@Inject B b;
匕首会再创造B和A吗?或者它会使用已经创建的那些?
如果有人花时间回答我的所有问题,我感激不尽.我不指望详细的答案.如果澄清这个概念就好了.期待着回应.提前致谢.
android ×9
android-mvp ×9
dagger-2 ×2
mvp ×2
androidx ×1
architecture ×1
dagger ×1
decoupling ×1
java ×1
json ×1
okhttp ×1
rx-java ×1