是否可以使用RxJava/RxAndroid和Retrofit执行定期的http请求,每隔x秒更新一次数据?
目前我正在使用一个每x秒触发的IntentService和Recursive Handler/Runnable.我想知道我是否可以删除所有这些并让RxJava处理请求.
final RestClient client = new RestClient();
final ApiService service = client.getApiService();
public interface ApiService {
@GET("/athletes")
public Observable<List<Athlete>> getAthletes();
}
service.getAthletes()
.retry(3)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Athlete>>() {
@Override
public void call(List<Athlete> athletes) {
// Handle Success
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// Handle Error
}
});
Run Code Online (Sandbox Code Playgroud)
编辑
完成所有操作后,我最终得到了以下代码.欢迎任何更新.
final Scheduler scheduler = Schedulers.from(Executors.newSingleThreadExecutor());
obs = Observable.interval(30, TimeUnit.SECONDS, scheduler)
.flatMap(tick -> service.getAthletes(1, 0l))
// Performed on service.getAthletes() observable
.subscribeOn(scheduler)
.observeOn(AndroidSchedulers.mainThread())
.doOnError(err -> …Run Code Online (Sandbox Code Playgroud) 我正在运行Xcode 5并为iOS 7构建.当我尝试构建此项目以进行存档时,我收到此错误.我在我的本地机器和我的jenkins构建服务器上得到它.我已经浏览了故事板,我没有找到任何理由来解决这个错误.它在模拟器和设备上构建得很好.我甚至不确定runtime.nib是什么,尽管addEditHCPViewController.nib是对故事板内部的一个视图控制器的引用.有任何想法吗?
CompileStoryboard myApp/Profiles.storyboard
cd "/builds/Company/workspace/myApp"
setenv IBSC_MINIMUM_COMPATIBILITY_VERSION 6.1
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
setenv XCODE_DEVELOPER_USR_PATH /Applications/Xcode.app/Contents/Developer/usr/bin/..
/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool --errors --warnings --notices --minimum-deployment-target 6.1 --output-format human-readable-text --compile /builds/Company/workspace/myApp/build/Distribution-iphoneos/myApp.app/Profiles.storyboardc /builds/Company/workspace/myApp/myApp/Profiles.storyboard
/* com.apple.ibtool.document.warnings */
/builds/Company/workspace/myApp/myApp/Profiles.storyboard:jlW-RT-oUY: warning: 2 views are vertically ambiguous.
/builds/Company/workspace/myApp/myApp/Profiles.storyboard:1Qm-h4-IZr: warning: Position is ambiguous for "Picker".
/builds/Company/workspace/myApp/myApp/Profiles.storyboard:d8p-iA-2QW: warning: Frame for "Button" will be different at run time.
/* com.apple.ibtool.errors */
/builds/Company/workspace/myApp/myApp/Profiles.storyboard: error: Compilation failed. Unable to write to path: /builds/Company/workspace/myApp/build/Distribution-iphoneos/myApp.app/Profiles.storyboardc
Underlying Errors:
Description: The file “runtime.nib” doesn’t exist.
Failure Reason: The file …Run Code Online (Sandbox Code Playgroud) 基于类型向类添加函数的惯用方法是什么?以下示例使用List作为类,Type Parameter <T>是列表中的对象类.假设您希望根据类型使用不同的比较器对每个列表进行排序.
data class A(val foo: String)
data class B(val bar: Int)
private val aComparator: Comparator<A> = Comparator { lhs, rhs -> rhs.foo.compareTo(lhs.foo) }
private val bComparator: Comparator<B> = Comparator { lhs, rhs -> rhs.bar.compareTo(lhs.bar) }
fun <T: A> List<T>.sort(): List<T> {
return this.sortedWith<T>(aComparator)
}
fun <T: B> List<T>.sort(): List<T> {
return this.sortedWith<T>(bComparator)
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误,指出由于Java的重载规则,两个排序函数具有相同的签名.在Java中,我可能会给它们两个不同的可识别名称,但它作为Kotlin扩展(egasortA()b.sortB())相当丑陋.Kotlin没有向List <B>显示sortA,所以似乎有更好的方法来编写sort()来处理不同对象上的不同比较器.
这个例子非常简单,但想象一下,如果我没有修改类A和B的权限,那么我就无法使用继承或在它们上实现接口.我还考虑过为每个类添加一个比较器并使用Any?但这似乎也很麻烦.
Java的:
public class JavaClass implements ModelController.Callback {
@Override
public void onModelsLoaded(@NonNull List<? extends Model> models) {
doSomething(models);
}
private void doSomething(List<Model> models) { }
}
Run Code Online (Sandbox Code Playgroud)
科特林:
class ModelController {
var callback = WeakReference<Callback>(null)
interface Callback {
fun onModelsLoaded(models: List<Model>)
}
fun someFunction() {
callback.get().onModelsLoaded(ArrayList<Model>())
}
}
interface Model {
}
Run Code Online (Sandbox Code Playgroud)
没有?在Java onModelsLoaded方法中扩展Model,覆盖与Kotlin中的接口不匹配.有了它,我收到以下错误:
doSomething(<java.util.List<com.yada.Model>) cannot be applied to (java.util.List<capture<? extends com.yada.Model>>)
Run Code Online (Sandbox Code Playgroud)
为什么需要通配符捕获,为什么不允许它用于非通配符方法?
kotlin ×2
android ×1
ios ×1
iphone ×1
jenkins ×1
objective-c ×1
retrofit ×1
rx-android ×1
rx-java ×1
xcode ×1