美文网首页Android汇总总结
关于Android线程与Handler的理解。

关于Android线程与Handler的理解。

作者: Cooke_ | 来源:发表于2016-09-27 13:41 被阅读62次

概述

我们都知道,更新UI只能在主线程中操作,若是在子线程中访问UI控件,容易引起阻塞。
问题来了,什么是主线程,什么是子线程?

主线程

主线程是指进程所拥有的线程。当一个android程序启动时,会单独启动一个进程,默认情况下只有一个。程序启动时,进程会启动一个主线程,也就是UI线程,主要是负责控制UI界面的显示、更新和控件交互。Android的主线程就是ActivityThread,主线程的入口方法为Main,在main方法中系统会通过Looper.prepareMainLooper()来创建主线程的Looper以及MessageQueue,并通过Looper.loop()来开启主线程的消息循环。看一下过程。

    public static ActivityThread currentActivityThread() {  
        return sThreadLocal.get();  
    }  
  
   
    public static void main(String[] args) {  
        SamplingProfilerIntegration.start();  
  
        // CloseGuard defaults to true and can be quite spammy.  We  
        // disable it here, but selectively enable it later (via  
        // StrictMode) on debug builds, but using DropBox, not logs.  
        CloseGuard.setEnabled(false);  
  
        Environment.initForCurrentUser();  
  
        // Set the reporter for event logging in libcore  
        EventLogger.setReporter(new EventLoggingReporter());  
  
        Process.setArgV0("<pre-initialized>");  
  
        Looper.prepareMainLooper();  
  
        // 创建ActivityThread实例  
        ActivityThread thread = new ActivityThread();  
        thread.attach(false);  
  
        if (sMainThreadHandler == null) {  
            sMainThreadHandler = thread.getHandler();  
        }  
  
        AsyncTask.init();  
  
        if (false) {  
            Looper.myLooper().setMessageLogging(new  
                    LogPrinter(Log.DEBUG, "ActivityThread"));  
        }  
  
        Looper.loop();  
  
        throw new RuntimeException("Main thread loop unexpectedly exited");  
    }  
}  

子线程

子线程主要负责一些耗时任务的执行,再配合主线程进行UI的更新。
子线程默认是没有Looper的,若是使用Handler进行消息的传递,需要手动进行创建Looper

new Thread(){
@override
public void run(){
Looper.prepare();//创建Looper对象
Handler handler = new Handler();//这种构造方式会默认使用当前线程的Looper
Looper.loop();//Looper开始工作
  }
}.start();

但这种情况下是不能通过handler更新UI的,因为handler并没有实例化在主线程中。这时值能处理非更新UI的的操作。如果你想在这个子线程中更新UI的话,需要这么做

Handler handler = new Handler(Looper.getMainLooper());

这种构造方式引用了主线程的Looper,表示放到主UI线程去处理,所以可以更新UI。

判断当前线程是否为主线程。

  • 方法一:使用Looper类判断
    Looper.myLooper() == Looper.getMainLooper();

  • 方法二:通过查看Thread类的当前线程
    Thread.currentThread() == Looper.getMainLooper().getThread()

相关文章

  • 关于Android线程与Handler的理解。

    概述 我们都知道,更新UI只能在主线程中操作,若是在子线程中访问UI控件,容易引起阻塞。问题来了,什么是主线程,什...

  • Handler 源码分析

    Handler原理解析 Handler做为Android线程间通信的基础,是开发与面试必备技能。与之相关的有Asy...

  • Android Handler

    Handler 作用 Android 中的Handler 主要用于主线程与子线程之间的通信,也就是处理异步消息。简...

  • HandlerThread

    Android中为什么要采用Handler机制?Handler的作用是什么? Android中的UI线程(主线程)...

  • Android 面试准备

    Android的系统架构 Android Handler机制 Android 多线程-----AsyncTask详...

  • Android线程间通信

    android线程间通信的四种实现方式 通过Handler机制 子线程与子线程之间通信 unOnUiThread方...

  • Handler 的工作原理

    参考资料gityuan 一、Handler原理 Handler 是 Android 中线程间通信的组件。在异步线程...

  • Android 线程通信之Handler -- 一篇文章彻底弄懂

    标签: android 线程 handler 1 什么是handler Handler中文翻译为“处理者”,这里的...

  • Handler知识详解与源码分析

    1 Handler基本介绍 1.1 什么是Handler? Handler是Android的消息通信机制,用于线程...

  • Android基本知识

    1、Android的Handler运行机制 1. Message Message消息,理解为线程间交流的信息,处理...

网友评论

    本文标题:关于Android线程与Handler的理解。

    本文链接:https://www.haomeiwen.com/subject/mgifyttx.html