【问题标题】:Periodically fetching data (polling) from the server in Android定期从 Android 中的服务器获取数据(轮询)
【发布时间】:2025-12-07 21:45:06
【问题描述】:

我正在开发应用程序,我使用 rest 调用从服务器获取数据并将其添加到视图中。我正确获得了所有初始数据。我使用 AsyncTask 来做这件事。

现在我想定期(比如 2 分钟)从服务器获取新数据并将其添加到视图中。定期从 Android 中的服务器获取数据(轮询)。

【问题讨论】:

标签: java android android-asynctask


【解决方案1】:

您可以签出 AlarmManager 类来执行此操作。

Intent intent = new Intent(this, MyAlarmManager.class);

long scTime = 60*2000;//2mins

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + scTime, pendingIntent);

这里是警报管理器--

public class MyAlarmManager extends BroadcastReceiver {

    Context _context;
        @Override
        public void onReceive(Context context, Intent intent) {
            _context= context;
            //connect to server..

        }
}

当 AlarmManager 被“触发”时,再次连接到服务器并填充您刚刚收到的数据。

http://developer.android.com/reference/android/app/AlarmManager.html

【讨论】:

  • 嗨 Umesh,尝试了您的解决方案。我使用 AlarmManager 作为内部类,它反过来执行更新我的 GUI 的异步调用。但我收到此错误:“无法实例化接收器”。我已将此添加到 AndroidManifest.xml 文件中: 有什么问题?
  • 如您所见,AlarmManager 是一个公共类,它扩展了 BroadcastReciever,需要写在不同的文件中。 (在上述情况下,文件名是 MyAlarmManager.java) 在清单文件中: receiver> 将其保留为内部类可能是这里的问题。
【解决方案2】:

按照here 中提到的教程进行操作。这正是您想要做的。此外,由于每隔几分钟就会进行一次服务器调用,这会消耗电池。因此,您可以仅在通过推送通知更改服务器数据时尝试服务器调用..

【讨论】:

    【解决方案3】:

    最好的方法是创建一个从服务器获取数据的服务。 之后,如果您的 Activity 正在运行,该服务可以使用获取的数据向 Activity 发送 Intent。

    或者,让服务在您的应用运行时运行,并在启动时让您的活动绑定到服务。然后使用 AIDL 或类似的东西与服务进行通信。
    (例如,每次服务获取数据时,它都会在您的活动中触发回调函数)

    【讨论】: