Android MVP:哪一层应存储上下文变量



我发现自己在用户单击视图上的按钮时需要播放声音文件。

MediaPlayer需要创建上下文。

放置MediaPlayer初始化代码的最佳方法是什么?

我应该将上下文传递到主持人方法中并在那里播放吗?

或者只能在视图上播放。

Context是MVP中Android View层的一部分,因此Presenter必须对此有任何了解,并且您不应该将其传递给presenter

您必须在View接口中添加一种方法,然后在Android视图组件(即ActivityFragment)中实现它,并使用它们在View层中执行操作作为播放声音。

Presenter必须要求进行UI事件,并且View必须处理它!

这是 MVP 使用 Dagger rxjava raterofit ,这可能会帮助您学习更多信息,关于Android中的MVP:

https://github.com/mmirhoseini/marvel

我经常将业务逻辑代码放在模型层中(不要在数据库中与模型混淆)。我经常将其重命名为XManager,以避免混淆(例如ProductManagerMediaManager ...),因此演示者类仅用于保持工作流程。

在演示者类中,经验法则是否或至少限制导入Android软件包。这种最佳实践为您提供了更轻松的测试演讲者课程,因为主持人现在只是一个普通的Java课程,因此我们不需要Android框架来测试这些东西。

例如,这是我的MVP工作流程。

查看类:这是您存储所有视图的地方,例如按钮,textView ...,您将所有侦听器设置为在此层上的这些视图组件。另外,在此视图中,您为演示者稍后实施一个侦听类。您的视图组件将在此听众类上调用方法。

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();
   }
}

主持人类:这是您在其中存储视图和模型的地方,以供以后调用。此外,演示者类也将实现上面定义的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();
    }
}

经理类:这是核心业务逻辑代码。也许一位主持人会有许多经理(取决于观点的复杂程度)。通常,我们通过某些注入框架(例如Dagger

)获得Context课程
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();
   }
}

最后:将这些东西放在活动中,片段...这是您初始化视图,经理并将所有内容分配给主持人的地方。

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();
   }
}

您会看到每个演示者,模型,视图都由一个接口包裹。这些组件将通过接口调用。此设计将使您的代码更强大,更容易修改以后。

这是回答您的问题的漫长帖子。我认为这很合适,因为每个人都有自己的MVP实施(核心流量相同,但少数群体不同)。因此,我在这里介绍了我经常在工作中使用的工作流程。希望您能看到这有用:)

如果您需要通用上下文,可以扩展应用程序,声明静态上下文变量,然后将此上下文获取到主持人中。

最新更新