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

时间:2016-09-01 05:08:37

标签: android mvp android-context

我是Android MVP Architecture的新手。据我所研究,Presenter应该不受任何机器人的攻击,例如:不要在演示者中使用getActivityContext。我编写了以下代码,其中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;
}

}

2 个答案:

答案 0 :(得分:8)

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

查看

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

    1. 决定如何处理用户输入。
    2. 从模型中收集数据。
    3. 告诉View该怎么做。
    4. 因此,对于单击按钮和显示Toasts的示例,您需要一个类似于:

      的设置

      查看界面

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

      public interface MainView {
      
          void showToast(String message);
      }
      

      演示者(Base&amp; Main)

      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中触发。