GUI冻结定期将数据从服务返回到活动

时间:2012-07-11 11:22:49

标签: android android-service android-2.3-gingerbread

我在android中创建了一个Service,它可以定期向活动发送数据。

到目前为止,我创建了一个binds与我创建的service的活动。 但是当我将消息发送回先前绑定的活动时,我的活动得到freez的问题。我已根据MessengerService示例中的API Demo示例创建此示例。

以下是在服务类中编写的代码,我在其中创建了IncomingHandler

case MSG_SET_VALUE:

mValue = msg.arg1;

for (int i=mClients.size()-1; i>=0; i--) {

    final Messenger local = mClients.get(i);
    final int index = i;
    counterThread = new Thread(new Runnable(){
    @Override
    public void run() {
        // TODO Auto-generated method stub
        int j=0;                

        while(true){

            try {
                Thread.sleep(6000);
                local.send(Message.obtain(null,
                    MSG_SET_VALUE, j++, 0));
                Log.d("Thread " , j + "");
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                 mClients.remove(index);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           

        }

    }




    });
counterThread.run();



}
break;

因此,当我使用以下代码从活动发送消息时,上面的案例将被触发。

         msg = Message.obtain(null,
                 MyService.MSG_SET_VALUE, this.hashCode(), 0);
         mService.send(msg);

我正在处理活动中的传入消息

 class IncomingHandler extends Handler {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MyService.MSG_SET_VALUE:

                     System.out.println("DATA" + msg.arg1);
                    //   mCallbackText.setText("Received from service: " + msg.arg1);

                     break;
           }
       }
    }

所以我想知道这是从服务定期获取数据的正确方法,还是我在这里遗漏了一些东西

1 个答案:

答案 0 :(得分:1)

counterThread.run();

这是一种不好的方法。您将调用start()来正确运行线程:

counterThread.start();