线程和处理程序

时间:2013-06-01 07:05:50

标签: android multithreading service android-activity handler

我的问题是ThreadHandler

之间有什么区别

Q1)它们的作用是什么?1)活动2)服务

Q2)在他们的生命周期中,他们之间有什么区别 我正在使用以下代码。

1)---------------------------

final Handler handler = new Handler();
Runnable runnable = new Runnable() 
{
    public void run() 
    {
        // do somthing
        handler.postDelayed(this, 1000);
    }
};
runnable.run();

2)---------------------------

handler = new Handler()
{
    @Override
    public void handleMessage(Message msg) 
    {
        super.handleMessage(msg);
    }
};



new Thread(new Runnable()
{
    public void run() 
    {
        while(true)
        {
            try 
            {
                Thread.sleep(1000);
                handler.sendEmptyMessage(0);
            } catch (InterruptedException e) {} 
        }
    }
}).start();

3 个答案:

答案 0 :(得分:1)

处理程序:   handler用于执行 looper thing.that执行相同的任务次数。   处理程序可以在主线程上执行

关于Handler如果在服务中使用它可能会在手机状态变为睡眠停止。 如果在活动中使用,你可以通过处理程序更新UI。

主题:   线程用于分开上的事物而不是活动的主线程。

即使手机状态变为睡眠模式,

线程也始终在后台运行。 u 无法更新UI 因为它没有在主线程上运行。可以使用asynctask而不是使用简单的java线程来完成。

答案 1 :(得分:0)

可以使用Handler通知一个线程来自另一个线程的事件。

典型用法是从其他线程通知UI线程。

我们无法直接修改其他线程的UI元素。因此,我们可以将Handler定义为Activity的成员。 在UI线程上创建活动,因此该处理程序也在UI线程上。 然后从另一个线程我们向Handler发送一条消息。收到消息后,Handler会修改一些UI元素。

答案 2 :(得分:0)

Q0)线程与处理程序有什么区别?

Threadthe same as it always is in programming。每个线程执行一次对方法的调用,然后终止。每个线程与每个其他线程并行运行。线程就像你一次发生多个事情一样。

在线程之间传递信息是notoriously difficult ...

Handler是Android将消息从一个线程传递到另一个线程的方式。具体来说,它允许您将一组指令作为Runnable传递给线程以执行该线程。通常,它们用作线程在完成时将结果报告回主线程的方式。

Q1)它们的作用是什么?1)活动2)服务

这两个项在服务中的行为方式或一般 之外的活动之间没有区别,服务可以存在于自己的process中如果android是instructed to do so。不同进程中的线程不能直接相互通信。服务用于共享数据,功能以及在某些情况下共享活动之间的线程。没有要求他们拥有自己的主题。

需要注意的一点是,只有main线程可以更新UI(活动)。

另外,网络也可以在主线程上完成。网络通常在服务中完成,以便可以共享结果,但这不是必需的。

围绕主线程必须做和不得做的限制使线程变得有点棘手,但这些限制可以帮助您避免意外冻结UI。

Q2)在他们的生命周期中,他们之间有什么区别我使用以下代码。

很难回答,因为我不了解您的代码的目的。

举个例子。 Android不再允许您在主线程上进行任何网络连接,因为这可能会在等待服务器通过可怜的WiFi连接进行响应时冻结UI。要根据从网络中检索到的内容更改UI上的内容,您必须使用线程进行网络连接并将数据传递回主线程以更新UI。

我的代码中的(doctored)代码段如下所示:

private final Handler handler = new Handler();

@Override
protected void onCreate( Bundle savedInstanceState ) {
    // irreverent to the example
    super.onCreate(savedInstanceState);
    super.setContentView(R.layout.abstract_main_view);

    // Here's the example
    Thread networkThread = new Thread() {

        @Override
        public void run() {
            // This could take several seconds
            final Collection<Player> players = service.lookupAllPlayers();
            Runnable uiUpdate = new Runnable() {

                @Override
                public void run() {
                    // This is quick, just adding some text on the screen
                    showPlayers(players);
                }
            };
            handler.post(uiUpdate);
        }
    };
    networkThread.start();
}

在这个例子中:

  1. 处理程序已创建并在此活动期间存在。因为这个类是由main线程构造的,所以Handler也是。这意味着发布到此处理程序的所有消息都将由main执行。

  2. networkThread由onCreate中的main线程创建并启动。这一直存在,直到它从网络中检索数据并将响应发布回main线程。然后就完成了。

  3. 检索完所有数据后,uiUpdate创建Runnable networkThread。它没有关联的线程,因此不会立即执行。而是使用处理程序将其发回main。然后在主线程上执行它并在完成后丢弃。