我对RoboSpice(高级用法)的问题很少。
注意:我将RoboSpice与OrmLite
一起使用。
我的Android应用程序由两个主要活动组成:第一个是SplashActivity
(启动时开始),第二个是MainActivity
(在启动画面后推出5秒)。我在启动时执行了2个请求:
SplashActivity
public class SplashActivity extends BaseActivity {
private fooRequest fooRequest;
private barRequest barRequest;
private exampleRequest exampleRequest;
private NewsRequest newsRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
fooRequest = new fooRequest();
barRequest = new barRequest();
...
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Launch MainActivity...
}
}, 5000);
}
@Override
protected void onStart() {
super.onStart();
getSpiceManager().execute(fooRequest, new Integer(0), DurationInMillis.ONE_DAY, new fooRequestListener());
getSpiceManager().execute(barRequest, new Integer(1), DurationInMillis.ONE_DAY, new barRequestListener());
}
public final class fooRequestListener implements RequestListener<Foo> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Log.w("MyApp", "RoboSpice - Foo request failure");
}
@Override
public void onRequestSuccess(final Foo result) {
}
}
public final class barRequestListener implements RequestListener<Bar> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Log.w("MyApp", "RoboSpice - Bar request failure");
}
@Override
public void onRequestSuccess(final Bar result) {
}
}
}
我的应用程序逻辑不太可靠:我们无法确定在启动MainAcitivty时请求是否已完成。在MainActivity上,我使用OrmLite查询我的数据库以获取一些数据并显示它们。因此,如果在SplashActivity上开始的请求没有完成,我的视图就不会显示任何内容。
1)我认为我需要为待处理的请求添加一个监听器(如果存在这样的请求)。在RoboSpice Wiki上,它说使用spiceManager.addListenerToPendingRequest
。尽管我进行了测试,但还是没有成功。也许我做错了什么?你能给我一些代码示例吗? 已解决(见下文)
2)目前,用户在到达主屏幕之前仍在等待5秒钟(计时器启动)。如何检查数据是否在缓存中?使用spiceManager.getDataFromCache()
(考虑到期时间?)。
3)失败请求的最佳重试策略是什么(a。在第一次启动时,如果不再创建数据库; b。如果数据库存在但数据已过期)?
问题#1已解决(我在原始代码中犯了错误) - #2和#3仍然相关。这是做什么的(如果它可以帮助某人......):
public class MainActivity extends BaseActivity {
private SpiceManager spiceManager = new SpiceManager(CalendarSpiceService.class);
...
@Override
protected void onStart() {
super.onStart();
spiceManager.start(this);
spiceManager.addListenerIfPending(Foo.class, new Integer(0), new fooRequestListener());
spiceManager.addListenerIfPending(Bar.class, new Integer(2), new newsRequestListener());
spiceManager.getFromCache(Foo.class, new Integer(0), DurationInMillis.ONE_DAY, new fooRequestListener());
spiceManager.getFromCache(Bar.class, new Integer(2), DurationInMillis.ONE_DAY, new newsRequestListener());
}
...
public final class fooRequestListener implements RequestListener<Foo> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Log.w("MyApp", "RoboSpice - Foo request failure");
}
@Override
public void onRequestSuccess(final Foo result) {
String test = result.getResult().iterator().next().getTitle();
Log.w("MyApp", "RoboSpice - Foo request OK ! "+test);
}
}
public final class barRequestListener implements RequestListener<Bar> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Log.w("MyApp", "RoboSpice - Bar request failure");
}
@Override
public void onRequestSuccess(final Bar result) {
Log.w("MyApp", "RoboSpice - Bar request OK ! "+test);
}
}
}
但我不明白spiceManager.getFromCache
这里的目标......
谢谢!
答案 0 :(得分:2)
我会让启动画面持续更长时间。它的目的看起来很模糊:显示徽标或其他内容,或执行请求并显示&#34;请等待消息&#34;。
在第一种情况下,不执行任何请求就没有问题。在第二种情况下,等待他们返回是没关系的。
我真的更喜欢那些应用程序,如果他们需要一个启动画面,可以快速启动。启动画面应持续不到1秒。它应该处理数据查询后的第一个屏幕,请等待消息。
但要回答你的问题:
2)是的,SpiceManager缓存方法以与executeRequest相同的方式使用缓存到期。您可以检查缓存中是否有某些内容,但您必须指定&#34;有效&#34;数据通过指定数据的到期限制。
3)我没有看到与重试政策和您的整体问题的链接。默认情况下,RoboSpice具有重试策略,可以重试失败请求3次。如果您无法从缓存中获取数据,则表示其中没有任何内容。如果调用了侦听器的故障挂钩,则网络请求失败。 两者都可以是同一个监听器,你的应用程序应该有一个通用机制1)显示出错的地方,2)如果需要一段时间后重新启动请求(可能是刷新按钮/项目菜单)。
我希望我帮助过,但不太确定。