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 用于登录到应用程序。我有两个用于插入 username
和 pasword
的编辑文本,我有一个用于 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 来处理成功的路线。
我正在尝试在 MVP 中使用 Rx、dagger、realm、retrofit 的项目 pattern.I 我不是这个库的专家,我对这些库了解不多。
在 Scope Application 的项目中,我声明了领域配置,然后获取实例以注入到我的演示者中。
在第一个 Activity 中调用 LoginActivityو 当它找到它的名称时,这个 activity 用于登录到应用程序。我有两个用于插入 username
和 pasword
的编辑文本,我有一个用于 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 来处理成功的路线。