我是Android MVP Architecture
的新手。据我所研究,Presenter
应该不受任何机器人的攻击,例如:不要在演示者中使用getActivity
或Context
。我编写了以下代码,其中BasePresenter
是我将使用的所有Presenter
类的父类。BaseView
接口是所有View类的父接口和{{ 1}} class是所有BaseActivity
类的父类。我有多个活动,需要在我的所有活动中显示Activity
条消息。所以我编写了如下代码。我不太确定使用演示者课程中的Toast
是否是一个好习惯。如果不是,那么有人可以建议任何更好的方法吗?
BasePresenter类
getactivity
BaseView类
public class BasePresenter<V extends BaseView> {
private V mView;
private Context mContext;
public void attachView(V view) {
mView = view;
mContext=mView.getActivity();
}
public void showToast(String msg) {
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
}
private Context getContext() {
return mContext;
}
public void detachView() {
mView = null;
}
}
BaseActivity类
public interface BaseView {
AppCompatActivity getActivity();
}
MainActivity类
public class BaseActivity extends AppCompatActivity {
public AppCompatActivity getActivity() {
return this;
}
}
答案 0 :(得分:8)
这不是一个好主意。您是Presenter(基础或其他)不应该了解Context,Activity,Toast或其他基于Android的内容。
查看
Presenter
。演示者
View
该怎么做。因此,对于单击按钮和显示Toasts的示例,您需要一个类似于:
的设置这就是您的演示者与您的视图对话的方式。它将由活动实施。
public interface MainView {
void showToast(String message);
}
BasePresenter几乎没有任务。只需绑定View界面即可。请注意,MainPresenter中的方法名称与诸如“点击”之类的内容不明确。从View实现中分离它们。
public class BasePresenter<V> {
protected V view;
public void attachView(V view) {
this.view = view;
}
}
public class MainPresenter extends BasePresenter<MainView> {
public void about() {
view.showToast("About was clicked");
}
public void cart() {
view.showToast("Cart was clicked");
}
}
Activity实现了View接口。它负责将用户事件传递给Presenter并执行Presenter命令。
public class MainActivity extends AppCompatActivity implements MainView {
private MainPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new MainPresenter();
presenter.attachView(this);
Button about = findViewById(R.id.button_about);
about.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.about();
}
});
Button cart = findViewById(R.id.button_cart);
cart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.cart();
}
});
}
@Override
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
在此设置中,Presenter不再了解Android的任何内容(根本没有从框架中导入),您可以为它编写单元测试,它可以直接在没有Android依赖的JVM上运行。
答案 1 :(得分:2)
Toast实际上在屏幕上可见。所以它不应该在主持人。它应该从View中触发。