`
suliuyes
  • 浏览: 93717 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Handler与Thread的区别

 
阅读更多

 

android里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。

一. Handler与Thread的区别。Handler与调用者处于同一线程,假如Handler里面做耗时的动作,调用者线程会阻塞。Android UI操作不是线程安全的,并且这些操作必须在UI线程中执行。Android提供了几种基本的可以在其他线程中处理UI操作的方案,包括Activity 的runOnUiThread(Runnable),View的post以及1.5版本的工具类AsyncTask等方案都采用了 Handler,Handler的post对线程的处理也不是真正start一个新的线程,而是直接调用了线程的run方法,这正是google煞费苦心搞一套Handler的用意。

public void onCreate(Bundle savedInstanceState) {

      super .onCreate(savedInstanceState);

      startThread();

      // sendMessage();

      SystemClock.sleep (2000);

      setContentView(R.layout.main );

   }

   public void startThread() {

      mThread.start();

   }

   public void sendMessage() {

      MHandler mHandler = new MHandler();

      Message msg = mHandler.obtainMessage();

      msg.sendToTarget();

   }

   class MHandler extends Handler {

      public MHandler() {

      }

      public MHandler(Looper l) {

        super (l);

      }

      @Override

      public void handleMessage(Message msg) {

        int count = 0;

        while (count++ < Integer.MAX_VALUE ) {

           Log.d (TAG , "Rintail");

        }

      }

   }

   Thread mThread = new Thread() {

      @Override

      public void run() {

        int count = 0;

        while (count++ < Integer.MAX_VALUE ) {

           Log.d (TAG , "Rintail");

        }

      }

   };

 二.    Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的。但是假如用不同的Looper则能达到并发的目的。Service 中,onStart的执行也是阻塞的。假如一个startService在onStart执行完成之前,再次条用startService也会阻塞。假如希望能尽快的执行onStart则可以在onStart中使用handler,因为Message的send是非阻塞的。假如要是不同消息的处理也是并发的,则可以用不同的Looper实例化Handler。

 public void onStart(Intent intent, int startId) {

      super .onStart(intent, startId);

      sendMessageWithLooper();

      //sendMessage();

   }

   public void sendMessage() {

      MHandler mHandler = new MHandler();

      Message msg = mHandler.obtainMessage();

      msg.sendToTarget();

   }

   public void sendMessageWithLooper() {

      HandlerThread ht = new HandlerThread("Rintail");

      ht.start();

      MHandler mHandler = new MHandler(ht.getLooper());

      Message msg = mHandler.obtainMessage();

      msg.sendToTarget();

   }

   class MHandler extends Handler {

      public MHandler() {

      }

      public MHandler(Looper l) {

        super (l);

      }

      @Override

      public void handleMessage(Message msg) {

        Log.d (TAG , "first");

        while (true ) {

           if (false )

              break ;

        }

        Log.d (TAG , "second");

      }

   };

   class MyThread extends Thread {

      @Override

      public void run() {

        Log.d (TAG , "first");

        while (true ) {

           if (false )

              break ;

        }

        Log.d (TAG , "second");

      }

   };
 三.  资源回收

向Handler对象发送类似new Message ()形式的空Message可以达到清空Message的目的,这种做法与getLooper().quit()的做法是一样的。假如利用的资源较多,应及时清理。

 

分享到:
评论

相关推荐

    Handler + Thread + Looper

    Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...

    Android:Handler的post()方法和Thread的start()方法执行Thread的run()方法的区别

    System.out.println("Handler--&gt;"+Thread.currentThread().getName()); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if ...

    Handler+Thread

    一个`Handler`对象通常与特定的`Looper`和`MessageQueue`关联,`Looper`循环地从`MessageQueue`中取出消息并分发给相应的`Handler`进行处理。这样,我们可以在工作线程中执行耗时任务,然后通过`Handler`将结果发送...

    AsyncTask 与Thread加Handler处理消息比较

    本篇文章将详细探讨两种常见的异步处理方式:`AsyncTask`和`Thread`配合`Handler`,并进行对比分析。 `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理机制,它主要用于短时间的后台操作,如网络请求、数据...

    Android线程模式(handler,thread,looper)

    不过,当需要精确控制消息的处理顺序,或者需要与主线程进行复杂交互时,Handler、Thread和Looper的组合就显得尤为重要。 总结一下,Android的Handler-Thread-Looper模型是多线程通信的关键,通过Handler发送消息,...

    android service thread toast handler

    在Android开发中,`Service`、`Thread`、`Toast`和`Handler`是四个非常重要的组件和概念,它们在创建高效、响应式的应用程序中起着关键作用。下面将详细阐述这些知识点及其相互关系。 首先,`Service`是Android中的...

    测试Thread中使用Handler修改

    1. **创建Handler实例**:首先,在主线程中创建一个`Handler`实例,这个`Handler`会与主线程的`Looper`关联。 ```java Handler handler = new Handler() { @Override public void handleMessage(Message msg) { ...

    Handler结合thread 异步加载网络图片

    通常,Handler与Looper和Message配合使用。Looper是每个线程中的消息循环,负责接收和分发Message。主线程默认已经有一个运行的Looper,但其他线程需要手动创建和启动Looper。 在"Handler结合thread异步加载网络...

    关于Thread和Handler的使用(一)

    在Android开发中,Thread和Handler是两个非常关键的概念,它们用于处理线程间通信和UI更新,确保程序的运行效率和用户体验。这篇博客主要探讨了如何有效地使用Thread和Handler进行多线程操作。 首先,Thread在Java...

    Android Thread Handler

    在Android应用开发中,线程(Thread)和Handler是实现多任务并行处理以及界面更新的关键组件。Android系统是一个单线程模型,主线程(UI线程)负责处理用户交互和绘制界面,而其他工作通常需要在后台线程中执行,以...

    Thread_Handler_MessageDownload.zip

    总结来说,"Thread_Handler_MessageDownload"项目通过实践展示了如何在Android中使用Thread进行后台操作,利用Handler和Message在工作线程与主线程之间进行高效、安全的通信,实现网络图片的异步加载。这种方法对于...

    handler结合Thread异步加载网络图片

    `Handler`需要与`Looper`配合工作,`Looper`是一个消息循环,它不断检查消息队列并处理其中的消息。 下面是一个简单的使用`Handler`、`Thread`和`Looper`异步加载网络图片的步骤: 1. **创建后台线程**:创建一个...

    Thread、Handler和HandlerThread关系详解

    前几天看到一道面试题:Thread、Handler和HandlerThread有什么区别?,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),...

    android Handler Thread AsyncTask httpURLConnection

    在Android开发中,`Handler`、`Thread`、`AsyncTask`和`HttpURLConnection`是四个非常关键的概念,它们涉及到应用程序的多线程处理、网络通信以及UI更新。接下来,我们将详细探讨这些知识点。 首先,`Thread`是Java...

    WebView+Thread(内置Handler)实现应用内浏览器demo1

    在Android中,WebView通常用于加载和展示网页内容,而Thread和Handler则用于解决UI线程与后台任务之间的通信问题,避免阻塞主线程。 【知识点详解】 1. **WebView**: Android系统提供的一个可以加载网页的组件,它...

    ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    为了解决这个问题,Android提供了多种异步处理机制,其中一种常见的方式是使用`Thread`配合`Handler`来实现非UI线程执行耗时任务并更新UI。本篇将详细介绍这一方法。 首先,我们需要理解Android的线程模型。Android...

    handler post的方法demo

    在Android开发中,`Handler`、`Thread`和`post`方法是实现UI线程与后台线程交互的重要工具。`Handler`类主要用于发送和处理消息,`Thread`用于开启新的执行线程,而`post()`方法则是`Handler`的一个关键函数,常用于...

    android 更新 UI 线程 handler

    为了解决这个问题,Android引入了Handler机制,配合Runnable对象来安全地在主线程中更新UI。以下将详细讲解这个过程。 首先,我们需要理解Android的线程模型。Android应用主要由主线程和工作线程组成。主线程负责...

    Handler与AsyncTask使用示例

    `Handler`通常与`Looper`配合使用,创建一个消息循环,使得`Handler`能够接收到并处理来自其他线程的消息。`Handler`的工作原理是,当创建一个`Handler`对象时,它会与当前线程的`Looper`关联,然后可以发送`Message...

    线程,线程池与Handler的用法

    在Android开发中,线程和线程池是处理异步任务的重要工具,而Handler则是用于在主线程和子线程之间通信的关键组件。本篇文章将深入探讨这些概念,以及它们在实际应用中的用法。 首先,让我们理解什么是线程。线程是...

Global site tag (gtag.js) - Google Analytics