在Presenter类中访问Actvity的Context是一个好习惯吗?如果没有那么还有其他更好的方法吗?

use*_*145 5 mvp android android-context

我是新来的Android MVP Architecture.据我所研究,Presenter应该保持免于任何Android的东西,例如:不要使用getActivityContext在演示者.我编写了以下代码,其中a BasePresenterPresenter我将使用BaseView的所有类BaseActivity的父Activity类.接口是所有View类的父接口,class是所有类的父类.我有多个活动,需要Toast在我的所有活动中显示消息.所以我编写了如下代码.我不太确定使用getactivity演示者课程是否是一个好习惯.如果不是那么有人可以建议任何更好的方法吗?

BasePresenter类

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

} 
Run Code Online (Sandbox Code Playgroud)

BaseView类

 public interface BaseView {
 AppCompatActivity getActivity();
 }
Run Code Online (Sandbox Code Playgroud)

BaseActivity类

public class BaseActivity extends AppCompatActivity {
public AppCompatActivity getActivity() {
    return this;
}

}
Run Code Online (Sandbox Code Playgroud)

MainActivity类

public class MainActivity extends BaseActivity implements MainView {
 MainPresenter basePresenter;
 @Override
protected void onStart() {
    super.onStart();
    basePresenter = new MainPresenter();
    basePresenter.attachView(this);
}

  // some more codes here

        switch (item.getItemId()) {
                case R.id.about:
                    basePresenter.showToast("About is Clicked");

                    break;
                case R.id.cart:
                    basePresenter.showToast("Cart is Clicked");

                    break;
                case R.id.favs:
                    basePresenter.showToast("Favs is Clicked");

                    break;
                case R.id.home:
                    basePresenter.showToast("Home is Clicked");

                    break;
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jah*_*old 8

这不是一个好主意.您是Presenter(基础或其他)不应该了解Context,Activity,Toast或其他基于Android的内容.

视图

  1. 显示事物.
  2. 处理用户输入并将其传递给Presenter.

主持人

  1. 决定如何处理用户输入.
  2. 从模型中收集数据.
  3. 告诉该View怎么做.

因此,对于单击按钮和显示Toasts的示例,您需要一个类似于以下设置的设置:

查看界面

这就是您的演示者与您的视图对话的方式.它将由活动实施.

public interface MainView {

    void showToast(String message);
}
Run Code Online (Sandbox Code Playgroud)

演示者(基地和主要)

BasePresenter几乎没有任何任务.只需绑定View界面即可.请注意,MainPresenter中的方法名称与"click"之类的内容不明确,以便将它们与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");
    }
}
Run Code Online (Sandbox Code Playgroud)

活动

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此设置中,Presenter不再了解任何有关Android的内容(根本没有从框架中导入),并且您可以为其编写单元测试,该测试可以直接在没有Android依赖项的JVM上运行.