2012-04-25 127 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