我刚刚开始使用kotlin在android中使用MVVM。我创建了一个仅获取用户位置的Android服务。该服务在后台不断运行,并使用FusedLocationApi来获取位置。我一直在阅读有关在MVVM中使用后台服务的文章。我发现最有帮助的文章是此Android Service MVVM通信。它说您必须在android服务和视图模型进行通信时使用存储库。但我也发现了一些文章,指出不要在View Model中使用Android Framework类(不要在View Model中使用Android类)。我完全困惑您如何将MVVM中的活动与Android服务进行通信。我们要么为此使用存储库,要么如何实现它。
任何帮助将不胜感激,
使用rx android和改造时,我在线程异常上得到网络。这是我的代码:
public Observable<PostVariablesModel> requestApiItem() {
return getauthenticationtoken.getToken().flatMap(new Func1<String, Observable<PostVariablesModel>>() {
public Observable<PostVariablesModel> call(String token) {
return service.postdata(value1, value2, value3, token);
}
}).subscribeOn(Schedulers.io());
}
public void postdata() {
requestApiItem() //I think problem is here any idea?
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<PostVariablesModel>() {
@Override
public void onCompleted() {
System.out.print("Complete");
}
@Override
public void onError(Throwable e) {
System.out.print("Fail");
}
@Override
public void onNext(PostVariablesModel apiResult) {
System.out.print(apiResult.toString());
}
});
}
Run Code Online (Sandbox Code Playgroud)
完成http调用后,我们是否需要取消订阅。任何的想法?
例外在下面给出。我在代码中的postdata方法的onError上收到此异常:
android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at okhttp3.Dns$1.lookup(Dns.java:39)
at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:170) …Run Code Online (Sandbox Code Playgroud)