从服务更新UI的更有效方法?

时间:2014-09-30 22:33:26

标签: java android

我目前正在编写我的第一个Android应用程序,它将ping游戏服务器,检查它们是否在线,并在用户离线时提醒用户。该应用程序还显示主活动上的每个服务器状态。为了做到这一点,我做了一个无限期运行的服务,循环遍历服务器对象的静态列表(它是静态的,因为只有一个服务实例),ping服务器,然后更改服务器在线/离线状态。对于主要活动,我创建了一个计时器,该计时器也循环遍历该列表,检查服务器的状态,然后将服务器的TextView更改为联机/脱机。我为更新UI制作单独计时器的原因是因为我只希望它在主要活动可见时运行。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您只想在主活动可见时运行它,那么实现一个方法来执行此操作。示例:How to detect when an Android app goes to the background and come back to the foreground

然后对于“服务器对象的静态列表”,我会小心使用静态内容,这通常不是一个好主意(并且访问静态成员“技术上较慢”)。

对于“计时器”不要这样做。而是让您的服务广播一个意图(或者如果您绑定它,让您的活动实现服务器可以在典型的观察者/监听器模式中与之交谈的自定义接口)。

E.g:

public interface ServerStatusListener {
    void onServerIsUp();
    void onServerIsDown();
}

如果你去广播意图路线,你的基地活动中有一个小型广播接收器,可以听取这个:

public class ServerStatusReceiver extends BroadcastReceiver {
   public void onReceive(final Context context, final Intent intent) {
     // analyze the intent and determine what happened
     // pseudo code
     if  (intent.getBooleanExtra("com.your.app.EXTRA_NETWORK_IS_UP", false) ) {
       serviceIsUp();
     } else {
       serviceIsDown();
     }
   }
}

你明白了。两种方法都可以。不同的概念。请记住,onReceive方法已经在UI线程上运行,不要在那里执行昂贵的东西。

阅读有关服务,广播接收器等的Android文档。这是很好的材料,如果您将成为Android开发人员,您将想知道这一点。

玩得开心!

答案 1 :(得分:0)

您可以考虑使用广播接收器。您的服务可以在每次完成动作时发送广播,然后您的主要活动可以订阅此广播并在每次收到广播时修改UI。

广播很容易扩展。如果您想要添加另一个监视服务状态的活动,那么另一个活动就会订阅相同的操作。