2012-04-25 149 views
0

我想將我的客戶端從Java Swing(Java client)移植到Android(Android client)。從後臺工作人員更新UI

基本上,我的Java client有一個線程,它運行一個永久while循環來接收UDP數據包,並基於UDP數據包的內容,相應的JFrame的UI將被更新。

現在我想我的Android clientbackground workerJava client線程,而worker將在main activity進行初始化。然後當有一些來自UDP套接字的請求時,main activity將啓動一些相應的活動(聊天活動),然後還有一些其他請求來自UDP套接字,the worker將更新活動(這個活動可以是主要活動或一個活動聊天活動),它正在屏幕上顯示。

所以我的問題是background worker應該是什麼:

  • 服務
  • 普通Java線程
  • 的AsyncTask
  • 還是什麼...

這是最合適的與我的要求?

謝謝!

回答

1

背景工人應該是一個服務,因爲

A服務是可以在後臺執行長時間運行 操作,並且不提供用戶界面的應用程序組件。

,而你的用戶界面將是一個活動,您的服務將讀取UDP數據包與活動將作相應修改。

+0

謝謝,但我還有一個問題:一個服務如何更新許多不同活動的UI。例如:服務讀取UDP數據包以獲取消息,然後如何將這些消息發送到不同的活動? – Leo 2012-04-25 08:16:31

+0

您可以使用bindService將活動綁定到服務。它將使您能夠訪問用於訪問 – njzk2 2012-04-25 08:19:18

+0

服務中的事物的IBinder,當您接收服務中的UDP數據包時,可以使用Intents更新活動。 – 2012-04-25 08:19:38

0

每個android應用程序都有一個類Application類。首先擴展它,它將在您的應用程序首次啓動時甚至在您的活動之前啓動。初始化/啓動你的普通java線程以在這裏執行後臺工作。關鍵的優勢是你可以從應用程序的任何地方獲得這個應用程序類的實例(這意味着你可以從應用程序中的任何地方控制後臺線程,發送後臺http請求等等......任何....)。然後初始化處理器在您想要進行更改的特定活動的UI線程上執行,並執行類似的操作。

    private Handler myHandler ; 

        public void checkBackgroundAndUpdateUi() 
        { 
        if(conetxt.getApplicationContext().getStatus == completed) 
        { 
         initializeHandler(); 
         handler.postRunnable(myRunnable); 

        } 
        } 
      Runnable myRunnable = new Runnable(){ 

       public void run() 
       { 

        // update your UI views here ..... 

       } 
      }; 

      private void initializeHandler(){ 
       myHandler = new Handler(); 
      } 
+0

我已經想過了,但我一直在思考:Application類中的線程如何在不同的活動(或不同的UI線程)中訪問不同的Handlers? – Leo 2012-04-25 08:20:45

+0

這太可怕了。避免它,除非你不能。它意味着應用程序對象中引用的所有內容 – njzk2 2012-04-25 08:28:26

+0

線程無法訪問不同的處理程序,但不同類中的處理程序可以訪問此線程。我認爲它是一種客戶端服務器通信,其中應用程序類中的線程僅用於發送請求,而活動類中的處理程序用於在UI中獲取響應和更新。 – Shachillies 2012-04-25 09:39:50