5

我对 RoboSpice(高级用法)有一些疑问。

注意:我将 RoboSpice 与OrmLite.

我的 Android 应用程序由两个主要活动组成:第一个是SplashActivity(启动时开始),第二个是MainActivity(在启动画面后 5 秒启动)。我在启动时执行 2 个请求:

飞溅活动

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 秒(定时器 Splash)。如何检查数据是否在缓存中?使用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这里的目的......

谢谢!

4

1 回答 1

2

我会让启动画面持续更长时间。看起来它的目的确实模棱两可:显示徽标或其他内容,或执行请求并显示“请稍候消息”。

在第一种情况下,不执行任何请求就可以了。第二个,等他们回来就好了。

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

但要回答你的问题:

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

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

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

于 2014-02-11T06:06:23.430 回答