2014-09-30 57 views
2

我目前正在編寫我的第一個Android應用程序,它將ping遊戲服務器,檢查它們是否在線,並在用戶離線時提醒用戶。該應用程序還顯示主要活動上的每個服務器狀態。爲了做到這一點,我做了一個無限期運行的服務,它循環訪問服務器對象的靜態列表(它是靜態的,因爲只有一個服務實例),ping服務器,然後將服務器狀態更改爲在線/離線。對於主要活動,我創建了一個計時器,該計時器還循環顯示該列表,檢查服務器的狀態,然後將服務器的TextView更改爲聯機/脫機。之所以我爲更新用戶界面做了一個單獨的計時器,是因爲我只希望它在主要活動可見時運行。有一個更好的方法嗎?從服務更新UI的更有效方法?

+0

你可以考慮使用事件總線模式。有幾個庫實現它([Otto](https://github.com/square/otto)或[EventBus](https://github.com/greenrobot/EventBus)) – 2014-09-30 23:37:11

回答

1

如果您只想在主要活動可見時運行它,請實施一種方法來執行此操作。例如:How to detect when an Android app goes to the background and come back to the foreground

然後,對於「服務器對象的靜態列表」,我會小心使用靜態的東西,這通常不是一個好主意(並且它在訪問靜態成員時「技術上比較慢」)。

對於「計時器」,不要這樣做。而是讓你的服務廣播一個意圖(或者如果你綁定它,讓你的活動實現一個定製的接口,服務器可以在典型的觀察者/監聽器模式中與之交談)。

例如爲:

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開發人員,您將需要知道這一點。

玩得開心!

0

你可以考慮一個廣播接收器。您的服務可以在每次完成操作時發送廣播,然後您的主要活動可以訂閱此廣播並在每次收到廣播時修改UI。

廣播很容易擴展。如果您想要添加其他活動來監視服務的狀態,那麼其他活動只會訂閱相同的操作。