Android MVP中start()和stop()的最佳做法?

时间:2018-01-05 08:42:49

标签: java android mvp

我对Presenter的start()stop()方法有一些疑问。你通常会在这些方法中加入什么来防止内存泄漏或任何潜在的问题。

例如,我有一个Activity来托管VideoView。传递给videoPath的{​​{1}}将传递到ActivityPresenter,以便将原始视频修剪为较短的视频,然后再传递回VideoUtility }与Activity一起玩。

这是一个混乱:我不知道调用VideoView方法的适当位置在哪里,因为它基本上只需要发生一次(与Android Architect Blueprint不同,任务更新时最新数据,因此它放在trimVideo())。

请参阅下面的代码段:

VideoEditorContract:

onResume()

VideoEditorActivityBase:

public interface VideoEditorContract {
  interface View extends BaseView<Presenter> {
      void playTrimVideo(String trimmedVideoPath);
  }

  interface Presenter extends BasePresenter {
  }
}

VideoEditorPresenter:

public class VideoEditorActivityBase extends AppCompatActivity implements VideoEditorContract.View {
  private VideoEditorContract.Presenter mPresenter;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video_editor);

    String videoPath = getIntent().getStringExtra(RequestCode.EXTRA_VIDEO_PATH);

    mPresenter = new VideoEditorPresenter(videoPath, this);
  }

  @Override
  public void onResume(){
    super.onResume();
    mPresenter.start();
  }

  @Override
  public void playTrimVideo(String trimmedVideoPath) {
    final VideoView vv = findViewById(R.id.act_video_editor_videoView);
    vv.setVideoPath(trimmedVideoPath);
    vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            vv.start();
        }
    });
  }

  @Override
  public void setPresenter(VideoEditorContract.Presenter presenter) {
    //do nothing as this activity has already init a presenter
  }
}

1 个答案:

答案 0 :(得分:0)

我在Medium中得到了Francesco Cervone关于此事的答案(他的文章也是关于MVP的优秀资源,顺便说一下。与Android Architect蓝图非常吻合)。我将相关位留给了未来的读者。

  

嗨,谢谢。

     

好吧,我认为应该在Presenter #start()中修剪视频。然后,在修剪视频后,演示者应调用view.playTrimmedVideo()。你不应该在presenter构造函数中做任何事情。

     

我认为视频“编辑”是昂贵的,所以你应该在一个单独的线程中(例如使用异步任务)。您需要实现Presenter #stop()方法,因为除非您保留演示者,否则必须取消正在进行的操作,除非您保留演示者。

     

你说只应调用一次trimVideo。您可以以某种方式缓存/保留trimVideo的结果,这样如果视频已被修剪,则使用它。

     

我希望我回答你的问题。

&#34;你能详细说明为什么我们不应该在Presenter的构造函数中添加任何东西?我在几个地方看过Presenter的极小构造函数,但我不明白背后的原因。&#34;

  

首先,这是一个责任问题:您要创建一个Presenter实例,我认为视频编辑不属于该对象的构造。

     

其次,您不知道何时实例化演示者,因此您不应在构造函数中执行昂贵的任务。如果使用一些依赖注入框架,则Presenter的构造将由框架本身管理,并且需要高效。其他对象的构造可能取决于演示者。