【问题标题】:How to use thread / timer in android service and update UI?如何在android服务中使用线程/计时器并更新UI?
【发布时间】:2012-10-16 12:49:03
【问题描述】:

我正在开发一个将启动服务的 android 应用程序。该服务将在每个固定的时间间隔后执行一些代码并将结果结束给 Activity。Activity 应该向用户显示结果。

首先我用线程进行了尝试。 为了在固定时间间隔后执行服务,我创建了一个线程 - 执行代码,获取结果 - 将此结果发送到活动以进行显示 - 使线程在某个固定时间间隔内休眠。 但它没有按预期工作。代码由线程执行。线程进入睡眠状态,然后在睡眠时间间隔后将结果发送到最后的活动。要求是线程代码执行得到结果后必须立即更新UI。

我也尝试过使用 Timer 和 TimerTask。但它给出了与上面相同的结果。 请帮我解决这个问题。

服务类

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    td = new ThreadDemo();
    td.start();
}
private class ThreadDemo extends Thread  
{
    @Override
        public void run()
        {
            super.run();
            String result = //code executes here and returns a result
            sendMessageToUI(result);  //method that will send result to Activity
            ThreadDemo.sleep(5000);
        }
}

private void sendMessageToUI(String strMessage)
{
    Bundle b = new Bundle();
    b.putString(“msg”, strMessage);
    Message msg = Message.obtain(null, 13);
    msg.setData(b);
}

活动类

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
    class IncomingHandler extends Handler 
    {
        @Override
        public void handleMessage(Message msg)
        {
            System.out.println("in ui got a msg................");
            switch (msg.what)
            {
                case 13:
                    System.out.println("setting status msg..............");
                    String str1 = msg.getData().getString("msg");
                    textview.setText(str1);
                    break;      
            }
        }
    }
}

【问题讨论】:

  • 不需要处理程序。使用runOnUiThread

标签: android multithreading service timer


【解决方案1】:

在您的情况下使用广播接收器要好得多。

在活动中注册它并从你的运行目标发送广播

【讨论】:

    【解决方案2】:

    使用本地广播管理器。您的服务将创建一个本地广播,并且它将可供您的应用程序使用。您可以在应用程序中为该通知编写适当的处理程序并相应地更新用户界面。

    将以下代码放入您的服务中

    Intent i = new Intent("NotificationServiceUpdate");
            LocalBroadcastManager.getInstance(this).sendBroadcast(i);
    

    在您的应用程序中,将以下内容放入您要更新的活动中

         LocalBroadcastManager.getInstance(this).registerReceiver(
                    mMessageReceiver, new IntentFilter("NotificationServiceUpdate"));
    

    现在,只要服务广播任务完成,您的活动就会收到通知。您可以进一步将此广播设为对您的应用程序私有。

    【讨论】:

    • 感谢您的快速回复。但是LocalBroadcastManager需要更高的API级别。并且要求是使用2.3.3。我有兴趣了解 Android 线程的行为。为什么它没有按预期工作?即更新 UI,然后休眠。谢谢。
    【解决方案3】:

    在这里查看我对 ScheduledExecutor 的回答:

    how to call a section of code every second in background in Android

    并像您当前所做的那样将消息使用到 UI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多