我对Presenter的start()
,stop()
方法有一些疑问。你通常会在这些方法中加入什么来防止内存泄漏或任何潜在的问题。
例如,我有一个Activity
来托管VideoView
。传递给videoPath
的{{1}}将传递到Activity
到Presenter
,以便将原始视频修剪为较短的视频,然后再传递回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
}
}
答案 0 :(得分:0)
我在Medium中得到了Francesco Cervone关于此事的答案(他的文章也是关于MVP的优秀资源,顺便说一下。与Android Architect蓝图非常吻合)。我将相关位留给了未来的读者。
嗨,谢谢。
好吧,我认为应该在Presenter #start()中修剪视频。然后,在修剪视频后,演示者应调用view.playTrimmedVideo()。你不应该在presenter构造函数中做任何事情。
我认为视频“编辑”是昂贵的,所以你应该在一个单独的线程中(例如使用异步任务)。您需要实现Presenter #stop()方法,因为除非您保留演示者,否则必须取消正在进行的操作,除非您保留演示者。
你说只应调用一次trimVideo。您可以以某种方式缓存/保留trimVideo的结果,这样如果视频已被修剪,则使用它。
我希望我回答你的问题。
&#34;你能详细说明为什么我们不应该在Presenter的构造函数中添加任何东西?我在几个地方看过Presenter的极小构造函数,但我不明白背后的原因。&#34;
首先,这是一个责任问题:您要创建一个Presenter实例,我认为视频编辑不属于该对象的构造。
其次,您不知道何时实例化演示者,因此您不应在构造函数中执行昂贵的任务。如果使用一些依赖注入框架,则Presenter的构造将由框架本身管理,并且需要高效。其他对象的构造可能取决于演示者。