主流架构打造社交游戏《谁是卧底》(一)


            new project   ,找到app目录下build.gradle文件打开找到并添加

dependencies{
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.google.android.gms:play-services-ads:8.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.google.android.gms:play-services-appindexing:8.4.0'
//bmob-sdk:3.4.6需要依赖support-v4(23.2.1)、okhttp(2.4.0)、okio(2.4.0)及org.apache.http.legacy包
compile 'cn.bmob.android:bmob-sdk:3.4.6'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okio:okio:1.4.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
compile 'com.github.zhaokaiqiang.klog:library:0.0.1'
这是本工程所有用到的库,因为也用了labmda表达式,所以也要引入插件
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'maven'
以及在android{
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
}中添加对java1.8的集成。当然还有找到project下的build.gradle文件找到{
   classpath 'com.android.tools.build:gradle:2.1.0'
   classpath 'me.tatarka:gradle-retrolambda:3.2.5'
请注意以上引入是建立在gradle版本2.1
权限,以及BMOB引入什么的,我就不贴代码了,参考BMOB就行了。
接下来,在app---src---main下新建几个MVP框架的包,bean,model,presenter,view,当然我省略了包名,在view中新建LoginActivity,MainActivity,Wapplication
其中LoginActivity当然是用来登录闪屏的,MainActivity下会有两个(暂时)Fragment切换,Wappliction初始化了一些SDK,本人的LOG工具用的一位高手的,
Wappliction
onCreate
加入KLog.init(BuildConfig.LOG_DEBUG);回到app目录下的build.gradle文件中的android下加入
buildTypes {
    debug {
        buildConfigField "boolean", "LOG_DEBUG", "true"
    }

    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "boolean", "LOG_DEBUG", "false"
    }
}
以便随时开关LOG。以上工程的布局阶段算是告一段落,接下来开始模拟<玩吧>。
首先是登录,在model包下新建IRquestModel接口,至于为什么要新建这个接口,因为要给等下新建的presnterImpl调用,调用接口中的方法而不管他是怎样的实现,
这是java解耦的一种原则,新建
Observable<WodiUser> BeanMachine(Context context);              //构建一个匿名用户,名称服务器中不重复,我用的System.current
Observable<List<WodiUser>> QueryUser(Context context);         //查询服务器中所有的在线用户

Observable<WodiUser> RegisterUser(Context context, WodiUser user);    //注册新建的用户

Observable<String> LoginUser(Context context, WodiUser user);        //登录新建的用户
这里用到了开源框架Rx ,因为上面接口类不做实现。所以还要在包下新建RequstModleImpl类来具体实现与服务器的交互,实现如下:
IRequestModel iUserModel;

@Override
public Observable<WodiUser> BeanMachine(Context context) {

    WodiUser new_user = new WodiUser();
    new_user.setUsername("新手" + System.currentTimeMillis());
    new_user.setPassword("123456");

    return Observable.just(new_user);
}

@Override
public Observable<WodiUser> FilterUser(List<WodiUser> users) {
    return Observable.from(users);
}


@Override
public Observable<List<WodiUser>> QueryUser(final Context context) {
    return Observable.create(new Observable.OnSubscribe<List<WodiUser>>() {
        @Override
        public void call(Subscriber<? super List<WodiUser>> subscriber) {
            BmobQuery<WodiUser> query = new BmobQuery<WodiUser>();
            query.findObjects(context, new FindListener<WodiUser>() {
                @Override
                public void onSuccess(List<WodiUser> users_) {
                    if (users_ == null) {
                        users_ = new ArrayList<WodiUser>();
                    }
                    Content.currentUserCount = users_.size();
                    subscriber.onNext(users_);
                }

                @Override
                public void onError(int code, String msg) {
                    subscriber.onError(new Exception(" query user error" + msg));
                }
            });
        }
    });
}

@Override
public Observable<WodiUser> RegisterUser(final Context context, WodiUser user) {
    KLog.v(user.getUsername());
    return Observable.create(new Observable.OnSubscribe<WodiUser>() {
        @Override
        public void call(Subscriber<? super WodiUser> subscriber) {
            user.signUp(context, new SaveListener() {

                @Override
                public void onSuccess() {
                    subscriber.onNext(user);
                }

                @Override
                public void onFailure(int i, String s) {
                    subscriber.onError(new Exception(" register user error" + s));
                }
            });
        }
    });

}

@Override
public Observable<String> LoginUser(final Context context, WodiUser user) {

    return Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            user.login(context, new SaveListener() {
                @Override
                public void onSuccess() {
                    KLog.v("LoginUser success" + user.getUsername());
                    Content.currentUser = user;
                    subscriber.onNext(Content.LOGIN_SUCESS);
                    subscriber.onCompleted();
                }

                @Override
                public void onFailure(int code, String msg) {
                    subscriber.onError(new Exception(" login user error:" + msg));
                }
            });
        }
    });
}
因为BMOB本身有注册登录的封装,所以就用他的了,接下来是在presenter中的调用,在presenter包下新建IRquestPresenter,这个接口中加入
void RegisterAndLogin();
用来处理登录,为了全局静态使用一些数据,这里也新建了一个专门的类来管理Content,在这个类中加入
public static WodiUser currentUser;     
自然也要在bean包下新建一个WodiUser     ,


而IRequestPresenter的实现类RequestPresenterImpl的代码如下: 

private IRequestModel userModel;
@Override
public void RegisterAndLogin() {
    Content.currentUser = WodiUser.getCurrentUser(context, WodiUser.class);
    if (Content.currentUser != null) {

        compositeSubscription.add(
                userModel.QueryUser(context)
                        .flatMap(us -> userModel.FilterUser(us))
                        .filter(u -> u.getUsername().equals(Content.currentUser.getUsername()))
                        .doOnNext(s -> s.setPassword("123456"))
                        .flatMap(user -> userModel.LoginUser(context, user))
                        .doOnError(e -> KLog.v("onError " + e.getMessage()))
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(s -> onLoginSuccess()));

    } else {
        compositeSubscription.add(
                userModel.BeanMachine(context)
                        .doOnError(e -> KLog.v("onError " + e.getMessage()))
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .flatMap(user -> userModel.RegisterUser(context, user))
                        .flatMap(user -> userModel.LoginUser(context, user))
                        .subscribe(s -> onLoginSuccess()));
    }
}
private void onLoginSuccess() {
    proxyHomeView.refreshOnlineUser();
    proxyHomeView.refreshUserInfo();
    //   proxyHomeView.hideLoading();
}

    Retrofit与Rx,lambda的结合使用,使代码简洁许多,并且只需在一个地方处理任意节点的错误,在登录成功后,刷新界面,presenter通过在view包下新建IUserView接口以及实现类
MainFragment来是数据变化呈现在界面中,MainFragment只需要继承IUserView并在实现的方法中写上界面刷新动作就不用管数据是怎么来的,这样做的好处是代码可读性很好,
view包下的类只管刷新UI,presenter负责管理数据的获取变换及何时刷新UI。
     因为是边学边练,还有很多不合理的地方以及细节没有完善,望高手指点,下篇编写进房间功能。






 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值