【问题标题】:How do I keep my Android app continuously connected with my own RESTful API to retrieve data continuously?如何让我的 Android 应用程序与我自己的 RESTful API 持续连接以持续检索数据?
【发布时间】:2017-06-17 19:04:52
【问题描述】:

请帮帮我!请

我正在使用 retrofit 连接我在 Express 和 Node 上运行的 RESTful API。现在我想连续从 api 获取我的数据意味着我的应用程序应该与 api 保持连续连接。

Retrofit 将请求排入队列,我们​​需要保持它一次又一次地发送。我尝试通过在服务中创建改造调用,但它会不断反映 UI,这意味着它会不断进行调用。

那我该怎么做呢?我需要让我的宁静服务成为实时的吗?或者有什么办法可以拨打这个电话? (请不要告诉我有关 Firebase 或 Parse 或任何东西的信息)

【问题讨论】:

  • 您可以创建一个调用 api 并且每隔 X 间隔运行一次的线程。但我认为使用套接字会更好
  • 我们可以用套接字绑定 UI 吗?这会在不刷新或请求请求的情况下保持我的连接吗? @PriyeshKumar
  • 给你一个建议。无论您要遵循什么,只要限制您的应用使用后台数据,否则 android 会将您的应用标记为耗电者

标签: android rest real-time


【解决方案1】:

我不太了解您的要求,但如果您确实需要持续保持与后端的连接,那么 REST 可能不是实现此目标的好方法。

如果您不想像您提到的那样使用某些专有解决方案,有很多方法可以实现您想要的,使用带有protobuf 等数据格式的套接字连接和RPC 等方法来实现交流。 我之前没有使用过它,但经过短暂的谷歌搜索后,我发现http://www.grpc.io/ 听起来很有希望。

如果您想保持 REST 作为您的 API 类型,那么您将需要采用基于轮询的方法或基于推送(通知)的方法,您只需不断地轮询端点,或开始轮询新数据收到推送通知后。

编辑:

如 cmets 中所述...在您的情况下,您可以查看 https://socket.io/blog/native-socket-io-and-android/ 以将实时数据从后端连接到应用程序。如果您的后端能够处理与您的客户保持大量连接所带来的要求,那么它就可以正常工作。

【讨论】:

  • 我看到了 grpc.io,但它又是一个 RPC 框架,我猜 REST 总是优于 RPC。正如你所说的推送轮询实现,我想要避免连续轮询。因为在我的要求中有一个不断的推送通知和对 api 的调用。那我该怎么办?
  • 嗯...我不确定我是否正确理解您的意思。 REST 端点的定义是通过 GET、POST、PUT 等方法基于 Http 请求/响应。因此,为了获得响应,您首先需要发出请求。如果您想以双向方式维护数据,则需要以某种方式对其进行流式传输,这将需要某种持久连接。 RPC 只是这样做的一种方式。据我所知,OKHttp 可以做 websockets。也许这会有所帮助? medium.com/@ssaurel/…
  • 如果我说我会让我的 RESTful 数据库成为一个实时数据库,那么那个 web-socket 会让应用程序与我的 API 保持同步吗?
  • 实时数据库只是当今用于工具的一个术语,它通过套接字连接同步数据,因此无论您在哪里看到它都是一样的。使用这些东西真的很容易。如果您计划将很多设备连接到您的服务,那么绝对建议您使用任何可用的实时数据库,因为...保持与大量手机的连接是一项艰巨的工作!如果您打算保持简单和小巧,您可以按照以下教程使用带有套接字的服务器/客户端:socket.io/blog/native-socket-io-and-android
  • 哇.. 我以前见过socket.io,但我不知道如何将android 客户端与socket 准确连接。非常感谢您提及它!我要求您编辑您的答案并在其中添加上述评论我会标记它已解决!谢谢
【解决方案2】:

您可以通过在 Handler 中启动 API 调用来实现此目的,该 Handler 将以时间间隔运行。每次 Handler 运行时它都会调用你的 API。 你可以这样做:

    Handler handler = new Handler();

    final Runnable r = new Runnable() {
        public void run() {
            //Initiate your API here
            handler.postDelayed(this, 5000);
        }
    };

    handler.postDelayed(r, 5000);

它将每 5 秒(5000 毫秒)启动一次您的 API。

【讨论】:

  • Android 会在某些手机(如 OnePlus 系列)中将应用程序标记为电池消耗器。所以这是最糟糕的解决方案
  • @BabulPatel 是正确的,我猜连续轮询(调用 API)不是一个好习惯,因为我在 android 中使用 Services 以不同的方式尝试了这个,我在 Services onCreate() 中启动了 api .
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 2019-06-05
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多