Android: 在 MVP 模式中按领域存储大量信息

Android: storing big size of info by realm in MVP pattern

我正在尝试在 MVP 中使用 Rx、dagger、realm、retrofit 的项目 pattern.I 我不是这个库的专家,我对这些库了解不多。

在 Scope Application 的项目中,我声明了领域配置,然后获取实例以注入到我的演示者中。

在第一个 Activity 中调用 LoginActivityو 当它找到它的名称时,这个 activity 用于登录到应用程序。我有两个用于插入 usernamepasword 的编辑文本,我有一个用于 login.when 的按钮,该按钮在 ViewLogin 中被单击 我已经观察到点击次数:

public Observable<Object> observeLoginBtn() {
    return RxView.clicks(mBinding.buttonLogin);
} 

并且在 LoginPresenter 中,我已经通过 RX 为登录任务实现了这个 observable。 当用户名和密码正确时,服务将return一个用户信息作为json发送给客户端。

{
"User": {
    "Address": "     ",
    "BirthDate": "1395/09/28",
    "Email": " ",
    "EnableExpireDate": null,
    "FirstName": "kia",
    "JobLocations": {
        "AllowDomains": "9,13",
        "Altitude": "12",
    },
    "UserImage": [..]...
}

这是 json.By 的一部分 实际上,通过 gson,我已经 return 向客户提供了所需的信息。 现在我想通过 realm.I 将此信息存储在设备中,通过 rx 完成登录任务,当服务器 returns 用户信息时,我在 onNext:

中获得此信息
        .switchMap(new Function<Response<String>, ObservableSource<UserInfo>>() {
            @Override
            public ObservableSource<UserInfo> apply(Response<String> stringResponse) throws Exception {
                String orginCookie = stringResponse.raw().header("Set-Cookie")
                        + "domain=" +
                        stringResponse.raw().header("Access-Control-Allow-Origin");
                String cookie = SerializeUtil.serializeCookie(orginCookie);
                return model.getLoginUser(info[0], cookie);
            }
        })
        .observeOn(AndroidSchedulers.mainThread())
   .subscribeWith(new DisposableObserver<UserInfo> (){
       @Override
       public void onNext(UserInfo userInfo) {

您现在 onNext 在 Ui thread 上执行。 现在在本节中,我想按领域存储此信息: 首先,我必须根据用户响应创建一个 RealmObject

public class UserInfo{
@SerializedName("User")
    private User user;
    public static UserInfo objectFromData(String str) {
        return new Gson().fromJson(str, UserInfo.class);
    }
    public User getUser() {
        return user;
    }
    public void setUser(User User) {
        this.user = User;
    }
}

嵌套用户 class:

public class User extends RealmObject implements RealmModel {
    public User objectFromData(String str) {

        return new Gson().fromJson(str, User.class);
    }
    @SerializedName("Tel")
    private String Tel;
    @SerializedName("UserName")
    private String UserName;
    @SerializedName("UserImage")
    private RealmList<Integer> UserImage;
   @SerializedName("JobLocations")
   private JobLocations jobLocations;
    .... //getter and setter
}

嵌套 JobLocations class:

public class JobLocations extends RealmObject implements RealmModel {
    public static JobLocations objectFromData(String str) {
        return new Gson().fromJson(str, JobLocations.class);
    }
    @SerializedName("AllowDomains")
    private String AllowDomains;
    @SerializedName("Altitude")
    private String Altitude;
    @SerializedName("City")
    private String City;
    .... // getter and setter
}

我已经创建了用于将我的模型插入数据库的存储库:

public class DatabaseRealm implements IDatabaseRealm{
...
@Override
public <T extends RealmObject> T add(T model) {
    realm.beginTransaction();
    realm.copyToRealm(model);
    realm.commitTransaction();
    return model;
}

这是写入发生的地方。 这是我将我的模型插入数据库的可观察位置:

public class TaskRepositoryImpl implements Repository<User> {
...
@Override
public Observable<User> add(final User model) {
    return Observable.create(new ObservableOnSubscribe<User>() {
        @Override
        public void subscribe(ObservableEmitter<User> emitter) throws Exception {
            try {
                databaseRealm.add(model);
                emitter.onNext(model);
                emitter.onComplete();
            }catch (Exception e) {
                emitter.onError(e);
            }
        }
    });
}

在 loginPresenter 的 subscribeWith 方法中,我收到了我的 json 用户信息,我正在使用这样的领域:

.subscribeWith(new DisposableObserver<UserInfo> (){
               @Override
               public void onNext(UserInfo userInfo) {
                    taskRepository.add(userInfo.getUser())
                            .subscribeOn(Schedulers.trampoline())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new DisposableObserver<User>() {
                                @Override
                                public void onNext(User user) {

                                }

                                @Override
                                public void onError(Throwable e) {

                                }

                                @Override
                                public void onComplete() {

                                }
                            });

现在我有两个主要问题: 1-存储data.I的好地方是指在subscribeWith的onNext中吗?

2- 有一个来自服务器的用户图像,我有一个很大的 size.I 认为存储在 ui 线程 它可以使 ANR error.How 我可以将此信息存储在我的模式 后台线程上吗 ?

对不起,我的文字很长 我尽量把它解释清楚了。

1.) 我很惊讶 private String UserName; 不是 @PrimaryKey

2.)

@Override
public <T extends RealmObject> T add(T model) {
    realm.beginTransaction();
    realm.copyToRealm(model);
    realm.commitTransaction();
    return model;
}

可能是

@Override
public <T extends RealmModel> Single<T> add(T model) {
    return Single.create((emitter) ->
        if(model.isManaged()) {
            return model;
        } 
        realm.executeTransactionAsync((r) -> {
             r.insertOrUpdate(model); // if has primary key 
        }, () -> {
            emitter.onSuccess(model);
        }, (throwable) -> {
            emitter.onError(throwable);
        } 
    );
}

或者非常相似的东西。然后你可以 flatMap 的 Single 来处理成功的路线。