一、MVP
什么是MVP
model-view-presenter。一种app架构模式,主要有三部分组成。其中view负责显示,model负责数据,presenter负责逻辑
为什么要使用MVP
mvc导致activity中代码膨胀
和MVC的区别
mvc导致activity中代码膨胀
实现
public interface IModel {
void destroy();
}
public class BaseModel implements IModel {
@Override
public void destroy() {
}
}
public interface IPresenter {
void destroy();
}
public class BasePresenter<M extends IModel,V extends IView> implements IPresenter {
protected M mModel;
protected V mView;
public BasePresenter(M mModel, V mView) {
this.mModel = mModel;
this.mView = mView;
}
@Override
public void destroy() {
if (mModel != null){
mModel.destroy();
mModel = null;
}
System.gc();
}
}
public interface IView {
void showLoading();
void hideLoading();
void showToast(String msg);
//...公有部分
}
public interface IActivity {
int bandLayout();
void initView();
void initData();
}
public interface IFragment extends IActivity{
<T extends View> T findViewById (@IdRes int ids);
}
public abstract class BaseActivity<P extends IPresenter> extends AppCompatActivity implements IActivity, IView {
protected P mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(bandLayout());
initView();
initData();
}
@Override
public void showToast(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void showLoading() {
}
@Override
public void hideLoading() {
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.destroy();
mPresenter = null;
}
}
}
public abstract class BaseFragment<P extends IPresenter> extends Fragment implements IFragment, IView {
private View mBaseView;
private P mPresenter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return mBaseView = inflater.inflate(bandLayout(), container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
initData();
}
@Override
public <T extends View> T findViewById(int ids) {
return mBaseView.findViewById(ids);
}
@Override
public void showToast(String msg) {
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
@Override
public void showLoading() {
}
@Override
public void hideLoading() {
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.destroy();
mPresenter = null;
}
}
}
参考
二、ButterKnife
什么是ButterKnife
Bind Android views and callbacks to fields and methods.
https://github.com/JakeWharton/butterknife
使用
1.依赖
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
2.坑
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
3.onCreate中调用
ButterKnife.bind(this);
@BindView(R.id.text_view)
TextView mTextView;
@BindView(R.id.btn)
Button mButton;
@BindString(R.string.my_name)
String mName;
@OnClick(R.id.btn)
public void click() {
String text = null;
if (mTextView != null) {
text = mTextView.getText().toString();
}
Toast.makeText(this, "click name: " + mName + " text: " + text, Toast.LENGTH_SHORT).show();
}
- 如果是在library中使用
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
}
}
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
class ExampleActivity extends Activity {
@BindView(R2.id.user) EditText username;
@BindView(R2.id.pass) EditText password;
...
}
注意,这里是R2
三、Dagger
1、Dagger是什么
A fast dependency injector for Java and Android.
https://github.com/google/dagger
2、几个标记的意义
@Inject
1.用来标记构造函数,Dagger可以调用它来创建该类的示例对外提供依赖;2、标记依赖字段,表示该字段由Dagger来提供实例。
@Provide
用来注解方法,该方法用来提供依赖。
@Module
用来注解类,该类用于提供依赖
@Component
一般用于标注接口,被标注了Component的接口,在编译时会由Dagger生成接口的实例作为提供依赖方和依赖宿主的桥梁
3、使用
1、第一种使用方法
implementation "com.google.dagger:dagger:2.16"
annotationProcessor "com.google.dagger:dagger-compiler:2.16"
public class Presenter {
@Inject
public Presenter() {
}
public void doSomeThing(Context context) {
Toast.makeText(context, "haha", Toast.LENGTH_SHORT).show();
}
}
@Component
public interface PresenterComponent {
void inject(DaggerActivity daggerActivity);
}
public class DaggerActivity extends AppCompatActivity {
@Inject
Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dagger);
DaggerPresenterComponent.builder().build().inject(this);
findViewById(R.id.button).setOnClickListener(v -> {
mPresenter.doSomeThing(this);
});
}
}
第二种使用方法
//同上
implementation "com.google.dagger:dagger:2.16"
annotationProcessor "com.google.dagger:dagger-compiler:2.16"
//同上
public class Presenter {
@Inject
public Presenter() {
}
public void doSomeThing(Context context) {
Toast.makeText(context, "haha", Toast.LENGTH_SHORT).show();
}
}
@Component(modules = {PresenterModule.class})
public interface PresenterComponent {
void inject(DaggerActivity daggerActivity);
}
@Module
public class PresenterModule {
@Provides
Presenter providerPresenter() {
return new Presenter();
}
}
public class DaggerActivity extends AppCompatActivity {
@Inject
Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dagger);
DaggerPresenterComponent.builder().presenterModule(new PresenterModule()).build().inject(this);
findViewById(R.id.button).setOnClickListener(v -> {
mPresenter.doSomeThing(this);
});
}
}
注入代参构造对象
public class Presenter {
MainActivity mMainActivity;
public Presenter(MainActivity mainActivity) {
this.mMainActivity = mainActivity;
}
public void doSomeThing(Context context) {
Toast.makeText(context, "haha", Toast.LENGTH_SHORT).show();
}
}
@Component(modules = PresenterModule.class)
public interface PresenterComponent {
void inject(MainActivity mainActivity);
}
@Module
public class PresenterModule {
MainActivity mMainActivity;
public PresenterModule(MainActivity mainActivity) {
this.mMainActivity = mainActivity;
}
@Provides
MainActivity provideMainActivity() {
return mMainActivity;
}
@Provides
Presenter providePresenter() {
return new Presenter(mMainActivity);
}
}
public class MainActivity extends AppCompatActivity {
@Inject
Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerPresenterComponent.builder().presenterModule(new PresenterModule(this)).build().inject(this);
mPresenter.doSomeThing(this);
}
}