如何使用RoboSpice连接待处理的请求(Splash>主要活动)?

时间:2014-01-26 18:01:56

标签: android ormlite robospice

我对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这里的目标......

谢谢!

1 个答案:

答案 0 :(得分:2)

我会让启动画面持续更长时间。它的目的看起来很模糊:显示徽标或其他内容,或执行请求并显示&#34;请等待消息&#34;。

在第一种情况下,不执行任何请求就没有问题。在第二种情况下,等待他们返回是没关系的。

我真的更喜欢那些应用程序,如果他们需要一个启动画面,可以快速启动。启动画面应持续不到1秒。它应该处理数据查询后的第一个屏幕,请等待消息。

但要回答你的问题:

2)是的,SpiceManager缓存方法以与executeRequest相同的方式使用缓存到期。您可以检查缓存中是否有某些内容,但您必须指定&#34;有效&#34;数据通过指定数据的到期限制。

3)我没有看到与重试政策和您的整体问题的链接。默认情况下,RoboSpice具有重试策略,可以重试失败请求3次。如果您无法从缓存中获取数据,则表示其中没有任何内容。如果调用了侦听器的故障挂钩,则网络请求失败。 两者都可以是同一个监听器,你的应用程序应该有一个通用机制1)显示出错的地方,2)如果需要一段时间后重新启动请求(可能是刷新按钮/项目菜单)。

我希望我帮助过,但不太确定。