1

Thread我的问题是和有什么区别Handler

Q1) 当它们用于 1) Activity 2) Service 时有什么作用

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();
4

3 回答 3

1

Handler: handler用来做looper的事情。也就是执行相同的任务次数。处理程序可以在主线程上执行

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

线程: 线程用于独立于活动的主线程的事物。

即使手机状态更改为睡眠模式,线程也始终在后台运行。不能更新 UI,因为它没有在主线程上运行。它可以使用 asynctask 来完成,而不是使用简单的 java 线程。

于 2013-06-01T10:31:04.567 回答
0

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

线程与编程中始终相同。每个线程对方法执行一次调用,然后终止。每个线程与其他所有线程并行运行。简而言之,线程是您同时发生不止一件事的方式。

在线程之间传递信息是出了名的困难......

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

Q1) 当它们用于 1) Activity 2) Service 时有什么作用

这两个项目在服务或活动中的行为方式一般没有区别,除非服务可以存在于它自己的进程中,如果 android 被指示这样做。不同进程中的线程不能直接相互通信。服务用于共享数据、功能以及在某些情况下活动之间的线程。他们不需要拥有自己的线程。

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

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

在主线程中必须和不能做的事情的限制使线程有点棘手,但这些限制可以帮助您避免意外冻结 UI。

Q2)他们之间在他们的寿命方面有什么区别我正在为他们使用以下代码。

很难回答,因为我不明白你的代码的目的。

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

我的代码中的(篡改)片段如下所示:

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. networkThreadmainonCreate 中的线程创建并启动。这将一直存在,直到它从网络检索数据并将响应发布回main线程。然后就完成了。

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

于 2013-06-02T21:46:10.923 回答
0

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

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

我们不能直接从其他线程修改 UI 元素。所以我们可以将 Handler 定义为 Activity 的成员。活动是在 UI 线程上创建的,因此这个处理程序也在 UI 线程上。因此,我们从另一个线程向 Handler 发送消息。并且在接收到消息时,处理程序会修改一些 UI 元素。

于 2013-06-01T07:14:43.463 回答