public interface BasePresenter {
//订阅
void subscribe();
//解订
void unsubscribe();
}
public interface BaseView<T> {
void setPresenter(T presenter);//view中设置处理器
}
1.新建MineContract,view与presenter的抽象接口集合,相当于讲下要去做那些事情
public interface MineContract {
interface View extends BaseView<Presenter>{
void login_success(String response);
void login_failure(String msg);
void network_exception(int errcode);
void network_normal();
}
interface Presenter extends BasePresenter{
void login(User user);
}
2.新建MinePresenter,实现MineContract.Presenter接口方法,相当于事情具体怎么去做
public class MinePresenter implements MineContract.Presenter {
private final static String TAG="MinePresenter";
private MineContract.View mView;
public MinePresenter(MineContract.View view) {
this.mView = view;
this.mView.setPresenter(this);
}
@Override
public void subscribe() {
}
@Override
public void unsubscribe() {
}
@Override
public void login(User user) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mView.login_success("success");
Log.d(TAG,"logined");
}
},500);
}
}
创建User类,作为登录测试
public class User {
private String uId;
private String uName;
private String uPwd;
private String uType;
private String uLevel;
//省略set与get方法
}
FragmentActivity
public class MainActivity extends FragmentActivity {
private FragmentManager mFragMgr;
@Inject
MinePresenter presenter;
private MineFragment mineFragment;
private final String MINE = "Mine";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragMgr = getSupportFragmentManager();
initFragments();
showFragments(MINE,true);
}
private void initFragments() {
mineFragment = new MineFragment();
}
private void showFragments(String tag, boolean init) {
FragmentTransaction trans = mFragMgr.beginTransaction();
if (init) {
trans.add(R.id.main_content, getFragmentByTag(tag), tag);
trans.addToBackStack(tag);
} else {
trans.replace(R.id.main_content, getFragmentByTag(tag), tag);
}
trans.commit();
}
private Fragment getFragmentByTag(String tag) {
if (MINE.equals(tag)) {
return mineFragment;
}
return null;
}
}
implements MineContract.View
接口public class MineFragment extends Fragment implements MineContract.View {
//省略部分代码
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
uName = (LikeEditText) view.findViewById(R.id.uName);
uPwd = (LikeEditText) view.findViewById(R.id.uPwd);
loginBtn = (Button) view.findViewById(R.id.login_btn);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
User user=new User();
user.setuName(uName.getText().toString());
user.setuPwd(uPwd.getText().toString());
minePresenter.login(user);
}
});
}
前面讲的都是mvp架构基本搭建,下面是如何运用dagger2;
一个应用在创建时会产生唯一的Application对象,可以在应用的onCreate
函数创建,下面有几个步骤:
1.1创建提供应用对象的Module
@Module
public class AppModule {
private Context mContext;
public AppModule(Context context){
this.mContext=context;
}
@Provides
public Context provideContext(){
return this.mContext;
}
}
1.2创建AppComponent为其他Component提供依赖
@Component(modules = AppModule.class)
public interface AppComponent {
Context getContext();
}
public class SampleApplication extends Application {
private AppComponent appComponent;
private static SampleApplication mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance=this;
appComponent=DaggerAppComponent.builder().appModule(new AppModule(this)).build();
}
public static SampleApplication getInstance(){
return mInstance;
}
public AppComponent getAppComponent(){
return appComponent;
}
}
@Inject
public MinePresenter(MineContract.View view) {
this.mView = view;
this.mView.setPresenter(this);
}
@Module
public class MinePresenterModule {
private final MineContract.View mView;
public MinePresenterModule(MineContract.View view) {
mView = view;
}
@Provides
MineContract.View provideStatisticsContractView() {
return mView;
}
}
@Component(dependencies = AppComponent.class,modules = MinePresenterModule.class)
public interface MainComponent {
MineFragment inject(MineFragment mineFragment);
MainActivity inject(MainActivity mainActivity);
}
@Inject
MinePresenter presenter;
private void initFragments() {
mineFragment = new MineFragment();
DaggerMainComponent.builder().minePresenterModule(new MinePresenterModule(mineFragment)).appComponent(SampleApplication.getInstance().getAppComponent()).build().inject(this);
}
以上所有的步骤已完成,编译项目,dagger2自动生成相关类,并完成注入。
Inject
方法