2013-04-12 47 views
0

我已經實現了一個IntentService,它從我的服務器獲取數據,並通過ResultReceiver將結果作爲JSON返回,並通過intent向服務提供。保持UI與服務的最新狀態

我的問題是保持UI與服務狀態最新,例如登錄到我的服務器發生通過此服務,如果我想告訴用戶該程序正在登錄我想顯示一個進度對話框,但是當有人打電話時,服務仍在提取數據,用戶是否旋轉手機或更改活動?

我不想讓用戶看着屏幕上有登錄按鈕,當登錄完成時它只顯示錶明狀態的吐司,我想讓用戶通知當前狀態。

如何在訪問我的服務時處理進度對話框而不會創建數百行重複代碼?

目前用戶想要登錄之後我LoginActivity在我ApiAccessor負責處理與服務通信調用登錄功能,並註冊一個回調時,結果又回來了這樣的方式:

ProgressDialog dialog; 


dialog = ProgressDialog.show(this, "Please wait..", "Logging in.."); 
accessor.login(usernameField.getText().toString(), passwordField.getText().toString(), new ApiCallback() { 

     @Override 
     public void onResponse(ApiResponse response) { 
      dialog.dismiss(); 
     } 
    }); 

,但現在我要在onPause,onResume和onDestroy中處理解僱和重生對話框,我必須在每個活動中都這樣做!

使UI保持與服務狀態等更新的常用方法是什麼?

回答

1

您需要閱讀整個服務指南和文檔的BIND部分。

http://developer.android.com/guide/components/bound-services.html

後的活動被綁定到服務,活動可以調用任何方法就可以了,這樣你就可以:

  • 創建界面
  • 的服務,例如創建方法as setOnSomethingHappenListener(MyInterface listener)
  • 實施活動界面上的活動
  • 活動活動要求myService.setOnSomethingHappenListener(this);
  • 如果監聽器不爲null,則調用接口中的方法(將這些事件傳遞給與其相關的任何活動)
  • 不要忘記覆蓋onUnbind以使偵聽器爲空。
+0

這並沒有真正改變現狀,對嗎?爲了處理正確顯示進度對話框,我仍然必須丟失重複代碼?這可能會使事情變得更加複雜,因爲IntentService已經爲我做了很多工作,而不是它應該只執行一項任務並返回? – Ruuhkis

+0

'什麼是使UI保持與服務狀態等更新的常見方式?這是活頁夾,服務將只是一個(沒有重複),活動只是綁定到運行服務(可能不應該是IntentService ,將不得不分析更多細節)。關於在所有活動中實現它,您可以使偵聽器成爲與活動不同的對象,但是可以用它初始化。你可以做一個抽象的基本活動來完成代碼並讓其他的擴展它。有辦法!但是它需要對整個系統進行適當的分析,以確定採用哪種方式。 – Budius

+0

謝謝,我對服務綁定的心態有問題,解決了我的問題。 :) – Ruuhkis