我开始开发一个大型GWT应用程序,在阅读了大量文章和博客文章之后,我试图了解2.2 Model-View-Presenter和2.1 Activities-Places设计模式之间的区别是什么?你推荐哪种模式?为什么?我应该仅仅因为它是"更新"而使用MVP吗?另一方面,地方活动似乎更"直观"......或者我完全忽略了这一点,而MVP只是活动场所的改进版本?
感谢所有GWT大师们:-)
我遵循的模型视图演示者(MVP)模式类似于Antonio Leiva在这里找到的例子:antoniolg/github.
我一直在玩它很多,我想知道如何service从interactor图层开始.通常情况下,我一直在retrofit调用我的电话,interactor但我想知道是否有办法从服务器启动服务,interactor所以我可以retrofit在服务中运行我的电话.这里的问题是我没有运行服务的活动上下文,如果我要将上下文暴露给它,它会破坏MVP的目的interactor.
我也不太确定这是否是一件好事(从交互者那里开始服务).我正在考虑从presenter层中启动服务,但是我正在朝着如何接近它的方向走向死胡同.
如果有办法解决这个问题,请帮助一个人吗?如果这不是一个好方法,或者启发我.
我刚刚开始使用Dagger 2,我在网上发现了数千个指南,每个指南都有不同的实现,现在我有点困惑.所以基本上这就是我现在写的:
AppModule.java:
@Module
public class AppModule {
Application mApplication;
public AppModule(Application application) {
mApplication = application;
}
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
Run Code Online (Sandbox Code Playgroud)
DataModule.java:
@Module
public class DataModule {
private static final String BASE_URL = "http://beta.fridgewizard.com:9001/api/";
@Provides
@Singleton
NetworkService provideNetworkService() {
return new NetworkService(BASE_URL);
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences(Application app) {
return PreferenceManager.getDefaultSharedPreferences(app);
}
}
Run Code Online (Sandbox Code Playgroud)
PrefsModel.java:
@Module(includes = DataModule.class)
public class PrefsModel {
@Provides
@Singleton
QueryPreferences provideQuery(SharedPreferences prefs) {
return new QueryPreferences(prefs);
}
}
Run Code Online (Sandbox Code Playgroud)
AppComponent.java(我暴露了QueryPreferences对象,因为我需要在演示者中使用它,希望以这种方式正确):
@Singleton …Run Code Online (Sandbox Code Playgroud) 我试图调用一个返回void(Java原始类型)的方法.我想延迟调用一个预定义的毫秒数.我知道这可以简单地使用Handler我喜欢不使用它.
我试着这样做:
Observable.just(getView().setAttachments(attachments)).delay(50, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)
但是,有一个编译错误,即:
Observable.just(java.lang.Void) cannot be applied to (void)
Run Code Online (Sandbox Code Playgroud)
还有另外一种方法吗?我不想使用的原因Handler是代码是在Presenter(MVP模式)中定义的,我不想在仅Java类中使用Android特定代码.我更喜欢它是一个冷的Observable,因为我不必订阅它,只调用一次方法.
我已经完成了这个和这篇文章.所以我真的同意主持人不应该知道Android特定事情的第二篇文章.所以我在想的是将互联网检查放在服务层.我正在使用Rx Java进行网络调用,所以我可以在进行服务调用之前进行网络检查,这样我就需要手动抛出和IOException,因为我需要在网络不可用时在视图上显示错误页面,另一个选择是我为没有互联网创建自己的错误类
Observable<PaginationResponse<Notification>> response = Observable.create(new Observable.OnSubscribe<PaginationResponse<Notification>>() {
@Override
public void call(Subscriber<? super PaginationResponse<Notification>> subscriber) {
if (isNetworkConnected()) {
Call<List<Notification>> call = mService.getNotifications();
try {
Response<List<Notification>> response = call.execute();
processPaginationResponse(subscriber, response);
} catch (IOException e) {
e.printStackTrace();
subscriber.onError(e);
}
} else {
//This is I am adding manually
subscriber.onError(new IOException);
}
subscriber.onCompleted();
}
});
Run Code Online (Sandbox Code Playgroud)
我的另一种方法是将拦截器添加到OkHttpClient并将其设置为改装
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
if (!isNetworkConnected()) {
throw new …Run Code Online (Sandbox Code Playgroud) 所以我有一个ApplicationComponent用于将单例注入到我的片段和演示者中,但我正在尝试创建一个组件以注入AppComponent所做的同一个演示者.沿着这些方向的东西.
@Component{modules = FileManagerModule.class}
public interface FileManagerComponet
{
public void inject(MyPresenter presenter);
}
@Component{modules = AppModule.class}
public interface AppComponent
{
public void inject(MyPresenter presenter);
}
@Module
public class AppModule
{
private Context appContext;
@Provides
@Singleton
public SharedPreferences preferences()
{
return appContext.sharedPreferences();
}
...
}
@Module
public class FileManagerModule
{
private Context activityContext;
@Provides
public FileManager FileManager()
{
return new FileManager(activityContext);
}
...
}
Run Code Online (Sandbox Code Playgroud) 我需要在模型中使用活动的Context,同时在android中使用MVP来获取所有已安装的应用程序的列表.访问上下文的正确方法是什么,或者在遵循MVP模式时实现相同的任何替代方法.
这是课程:
public class MainActivity extends BaseActivity
implements MainView,View.OnClickListener {
private MainPresenter mPresenter;
private Button sendButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
createPresenter();
}
private void init(){
sendButton= (Button) findViewById(R.id.button_send);
sendButton.setOnClickListener(this);
}
private void createPresenter() {
mPresenter=new MainPresenter();
mPresenter.addView(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button_send:
mPresenter.onSendButtonClick();
break;
}
}
@Override
public void openOptionsActivity() {
Intent intent=new Intent(this,OptionsActivity.class);
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
}
公共类MainPresenter扩展BasePresenter {
MainModel model;
public void onSendButtonClick(){
model.getListOfAllApps();
}
@Override
public void …Run Code Online (Sandbox Code Playgroud) 这是一个示例场景:
我有一个活动(视图)和该视图的演示者.演示者从网络API中提取用户列表,并使用List对象将其保存在内存中.活动包含不同类型的片段,以根据User.type显示有关用户的内容.这两个片段(UserType1Fragment和UserType2Fragment)也有各自的演示者.
活动的演示者决定下一个片段的类型(I或II).片段的演示者决定用户对象的显示方式,并处理名为killUser()的按钮单击事件.这应该更新活动的演示者中的List对象.
这就是问题所在:
片段如何呈现对活动演示者中的数据的引用?演示者不应直接相互沟通.也许我应该将List抽象到存储库/交互器中?如何在演示者之间共享列表?
我正在开发遵循MVP架构的项目.通常,当我使用recyclerView时,我的演示者控制适配器数据.但是现在我需要使用来自缓存(或类似缓存的数据)的数据制作回收器适配器,回收器的大小不依赖于缓存大小,所以我通过HashMap进行缓存,其中密钥是 - 回收器的位置,如果有一个项目然后数据显示地图,否则空行与"添加事件"btn.我无法意识到这种结构中缓存的位置 - 模型(Dao或类似CacheManager)或适配器.
缓存的想法如下:我有一些类型的事件存储在数据库中,每个事件修改都在db中更改它 - 所以缓存也必须更新.
主要问题是:在哪里保留此缓存并将其加载到适配器,如何使其与数据库更改保持同步.
PS我也尝试使用RX,所以如果可以用它来解决 - 试试会很有趣.
PPS如果它是Repository模式是解决方法 - 欢迎.前一段时间阅读它.