[英]Best practices for start() and stop() in Android MVP?
我对演示者的start()
, stop()
方法有一些疑问。 您通常会采用什么方法来防止内存泄漏或任何潜在的问题。
例如,我有一个托管VideoView
的Activity
。 传递给Activity
的videoPath
将传递给Presenter
的VideoUtility
以将原始视频修剪成较短的视频,然后再传递回Activity
以与VideoView
一起播放。
这是一个困惑:我不知道在哪里调用trimVideo()
方法是合适的地方,因为它基本上只需要发生一次(不同于Android Architect Blueprint中的任务会使用最新数据进行更新,因此将其放入onResume()
)。
请参见下面的代码片段:
VideoEditorContract:
public interface VideoEditorContract {
interface View extends BaseView<Presenter> {
void playTrimVideo(String trimmedVideoPath);
}
interface Presenter extends BasePresenter {
}
}
VideoEditorActivityBase:
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
}
}
VideoEditorPresenter:
public class VideoEditorPresenter implements VideoEditorContract.Presenter {
private final VideoEditorContract.View mVideoEditorView;
@NonNull
private String mVideoPath;
public VideoEditorPresenter(@NonNull String videoPath, @NonNull VideoEditorContract.View videoEditorView) {
mVideoPath = checkNotNull(videoPath);
mVideoEditorView = checkNotNull(videoEditorView, "videoEditorView cannot be null!");
mVideoEditorView.setPresenter(this);
//trimVideo(); //should I do it here since this task is only need to be done once
}
@Override
public void start() {
//trimVideo(); //I can do it here but then I need to introduce a control variable; not sure if this is the best practice
}
private void trimVideo() {
//trim video stuff
}
// Currently it doesn't have a stop() method. But if it have one,
// what should I put in it? Releasing and clean up the
// VideoUtility I suppose?
}
我从Medium的 Francesco Cervone获得了有关此问题的答案(顺便说一句,他的文章也是MVP的极佳资源。与Android Architect Blueprint相得益彰)。 我将相关内容留给以后的读者。
嗨,谢谢你。
好吧,我认为应该在Presenter#start()中修剪视频。 然后,在修剪视频之后,演示者应调用view.playTrimmedVideo()。 您不应该在Presenter构造函数中做任何事情。
我认为视频“编辑”是很昂贵的,因此您应该在单独的线程中执行此操作(例如,使用异步任务)。 您需要实现Presenter#stop()方法,因为如果有正在进行的操作,则必须取消正在进行的操作,除非保留演示者。
您说trimVideo应该只调用一次。 您可以通过某种方式缓存/持久保存trimVideo的结果,以便在视频已被修剪的情况下使用它。
希望我回答了你的问题。
“您能详细说明为什么我们不应该在Presenter的构造函数中放置任何内容吗?我已经在几个地方看到了Presenter的最小构造函数,但我不明白其背后的原因。”
首先,这是一个责任问题:您将要创建一个Presenter实例,并且我认为视频编辑不属于该对象的构造。
其次,您不知道演示者何时实例化,因此您不应在构造函数中执行昂贵的任务。 如果使用某些依赖项注入框架,则Presenter的构建将由框架本身管理,并且需要高效。 其他对象的构造可能取决于演示者之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.