当用户点击视图上的按钮时,我发现自己需要播放声音文件.
MediaPlayer需要创建上下文.
放置MediaPlayer初始化代码的最佳方法是什么?
我应该将上下文传递给演示者方法并在那里播放吗?
或者只是在视图上播放是可以的.
Context是ViewMVP 中Android Layer 的一部分,所以Presenter一定不要对它有任何想法,你不应该把它传递给它presenter.
你必须在你的View界面中添加一个方法并在你的android视图组件(即Activity或Fragment)中实现它,并使用它们在View层中执行动作播放声音.
Presenter必须要求UI事件,View必须处理它!
这是使用Dagger,RxJava和Retrofit的MVP示例,它可以帮助您了解有关Android中MVP的更多信息:
https://github.com/mmirhoseini/marvel
我经常将业务逻辑代码放在模型层中(不要与数据库中的模型混淆).我经常重命名,XManager以避免混淆(例如ProductManager,MediaManager...),因此演示者类只是用于保持工作流程.
经验法则是没有或至少限制在演示者类中导入android包.这个最佳实践支持您更轻松地测试presenter类,因为presenter现在只是一个普通的java类,所以我们不需要android框架来测试这些东西.
例如,这是我的mvp工作流程.
视图类:这是一个存储所有视图的位置,例如按钮,textview ...并且您在此图层上设置这些视图组件的所有侦听器.此视图上,您还可以在以后为演示者实现定义一个Listener类.您的视图组件将调用此侦听器类上的方法.
class ViewImpl implements View {
Button playButton;
ViewListener listener;
public ViewImpl(ViewListener listener) {
// find all view
this.listener = listener;
playButton.setOnClickListener(new View.OnClickListener() {
listener.playSong();
});
}
public interface ViewListener {
playSong();
}
}
Run Code Online (Sandbox Code Playgroud)
Presenter类:这是您在里面存储视图和模型以便稍后调用的地方.另外,presenter类将实现上面定义的ViewListener接口.演示者的要点是控制逻辑工作流程.
class PresenterImpl extends Presenter implements ViewListener {
private View view;
private MediaManager mediaManager;
public PresenterImpl(View, MediaManager manager) {
this.view = view;
this.manager = manager;
}
@Override
public void playSong() {
mediaManager.playMedia();
}
}
Run Code Online (Sandbox Code Playgroud)
Manager类:这是核心业务逻辑代码.也许一位主持人会有很多经理(取决于视图的复杂程度).通常我们Context通过一些注入框架来获得课程,例如Dagger.
Class MediaManagerImpl extends MediaManager {
// using Dagger for injection context if you want
@Inject
private Context context;
private MediaPlayer mediaPlayer;
// dagger solution
public MediaPlayerManagerImpl() {
this.mediaPlayer = new MediaPlayer(context);
}
// no dagger solution
public MediaPlayerManagerImpl(Context context) {
this.context = context;
this.mediaPlayer = new MediaPlayer(context);
}
public void playMedia() {
mediaPlayer.play();
}
public void stopMedia() {
mediaPlayer.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
最后:将这些内容放在"活动","片段"中......这是您初始化视图,管理器并将所有内容分配给演示者的位置.
public class MyActivity extends Activity {
Presenter presenter;
@Override
public void onCreate() {
super.onCreate();
IView view = new ViewImpl();
MediaManager manager = new MediaManagerImpl(this.getApplicationContext());
// or this. if you use Dagger
MediaManager manager = new MediaManagerImpl();
presenter = new PresenterImpl(view, manager);
}
@Override
public void onStop() {
super.onStop();
presenter.onStop();
}
}
Run Code Online (Sandbox Code Playgroud)
您会看到每个演示者,模型,视图都由一个界面包装.这些组件将通过接口调用.此设计将使您的代码更加健壮,以后更容易修改.
这是一个很长的帖子来回答你的问题.我认为这是合适的,因为每个人都有自己的MVP实现(核心流程是相同的,但少数群体是不同的).所以我在这里介绍了我经常在工作中使用的工作流程.希望你看到这个有用:)