上文说到已经创建了app,但是此时的项目里只有两个光秃秃的文件。要完成一个完整的网站,还需要在上面添加handler和templates。...添加handler 添加蓝图 我们在项目中创建包handlers,在里面添加__init__.py和index.py两个文件。...在__init__.py中输入如下内容,创建蓝图games_bp,它的前缀是/games,也就是说,这个蓝图下的handler都要使用/games前缀才能访问。...在index.py中创建一个sanic的handler,并把它添加到蓝图。...6) app = Sanic(__name__) # 在这里导入blueprints,注意顺序在app之后,因为games_bp引入的包也可能导入app这个神对象 # 这样的循环依赖会导致app 被创建两次
创建测试表: root@test 04:53:11>show create table t; +——-+———————————————————————————————————————————————
1、在子线程中,如果手动为其创建了Looper,那么在所有的事情完成以后应该调用quit方法来终止消息循环,否则这个子线程就会一直处于等待(阻塞)状态,而如果退出Looper以后,这个线程就会立刻(执行所有方法并...ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中去执行,这个过程就是主线程的消息循环模型 4、Handler...创建的时候会采用当前线程的Looper来构造消息循环系统,Looper在哪个线程创建,就跟哪个线程绑定,并且Handler是在他关联的Looper对应的线程中处理消息的。...6、我们常用的更新UI都是通过Handler实现的。
package com.example.handlerdemo; import java.util.Date; import android.os.Bundle; import android.os.Handler...android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { Handler...()); handler.postDelayed(r, 1000); } }; start.setOnClickListener(new OnClickListener() {...@Override public void onClick(View v){ handler.post(r); } }); end.setOnClickListener...(new OnClickListener(){ @Override public void onClick(View v){ handler.removeCallbacks(r);
文章目录 一、Handler 发送与处理消息 ( 两大功能 ) 二、Handler 初始化 三、完整 Handler 代码 一、Handler 发送与处理消息 ( 两大功能 ) ---- Handler...执行 Message 任务 , 具体的执行逻辑需要 用户实现 ; 用户创建 Handler 时 , 需要覆盖 handleMessage 方法 , 在重写的方法中处理不同的 Message 任务 ;...中获取对应的消息队列 ; 这里就需要特别注意 , 在初始化 Handler 时 , 需要用到 Looper , 如果 Looper 为空 , Handler 初始化就会失败 ; 因此在 创建 Handler...获取 Looper 时 , Looper 必须已经初始化完毕, 也就是已经调用过 prepare 创建了 Looper 并将其放入了线程本地变量 */...必须已经初始化完毕, 也就是已经调用过 prepare 创建了 Looper 并将其放入了线程本地变量 */ // 获取当前线程中的 线程本地变量
(一)、Handler Handler 是线程间传递消息的即时接口,生产线程和消费线程用以下操作来使用Handler 生产线程:在消息队列中创建、插入或移除消息 消费线程:处理消息 ?...当使用Handler调用post方法来执行一个Runnable时,Handler隐式地创建了一个新的消息,并且设置callback参数来存储这个Runnable。...生产者创建了一个消息,并且发送给Handler,随后Handler 将这个消息加入消息队列中,在未来某个时间,Handler 会在消费小城中处理这个消息。...这一点非常重要,Android中创建的许多不同的Handler都关联到主线程的Looper。...翻译一下: HandlerThread可以创建一个带有looper的线程。Looper对象可以用于创建Handler类来进行调度。
Handler 创建 : 这里注意 只能在 Looper 线程中创建 Handler , 普通线程不能创建 Handler ; ① 主线程 : 主线程中可以直接创建 Handler , 因为在点击应用图标后就会...() 方法即可为该线程创建 Looper 对象 , 该线程也就转为了 Looper 线程 ; public class handler { ......Handler 对象个数 : 每个 Looper 线程可以创建多个 Handler , 只要该 Handler 与 Looper 和 MessageQueue 关联 , 就可以将 消息 ( Message...对象中存储 ; 线程只有创建了 Looper 对象才能创建 Handler , 将该 Looper 对象及其中封装的 MessageQueue 与 Handler 进行关联 , Handler 才可以进行消息的调度...创建 Handler 必须在 Looper.prepare() 之后, 否则会崩溃 handler = new Handler(){ @Override
super.handleMessage(msg); } }; Looper.loop(); } }).start(); Looper.prepare()方法就是创建...unexpectedly exited"); Looper.prepareMainLooper(); Looper.loop(); 其中最重要的就是这两句,调用了prepareMainLooper方法创建了主线程的...创建新线程呗,在主线程创建之前会创建一些其他的binder线程,比如ApplicationThraed。...刚才说到主线程之外还会创建一些binder线程,比如app线程,系统线程,一般是系统线程比如ApplicationThreadProxy传消息给APP线程ApplicationThread,然后再传给主线程...还是来点源码: @Override public void onCreate() { super.onCreate(); //创建新线程并start
() 使用步骤 /** * 此处以 匿名内部类 的使用方式为例 */ // 步骤1:在主线程中 通过匿名内部类 创建Handler类对象 private Handler...Looper对象,则也无法创建Handler对象 // 故 若需在子线程中创建Handler对象,则需先创建Looper对象 // 注:可通过...),从而 自动绑定了 实现创建Handler对象操作的线程 那么,当前线程的Looper对象 & 对应的消息队列对象(MessageQueue) 是什么时候创建的呢?...在子线程若不手动创建Looper对象 则无法生成Handler对象 根据Handler的作用(在主线程更新UI),故Handler实例的创建场景 主要在主线程 生成Looper & MessageQueue...---- 方式2:使用 Handler.post() 使用步骤 // 步骤1:在主线程中创建Handler实例 private Handler mhandler = new mHandler()
文章目录 一、主线程中的 Handler 与 Looper 二、Handler 原理简介 一、主线程中的 Handler 与 Looper ---- Android 系统中 , 点击图标启动一个应用进程..., 就是从 Linux 的 Zygote 进程 fork 一个子进程 , 之后该子进程就会创建 ActivityThread , 执行其中的 main 函数 , 该 main 函数就是应用的主线程 ;...Android 的主线程在 ActivityThread 中创建并维护 , 在该类中的 main 函数 , 就是 Activity 中的主函数 ; 在该主函数中 , 调用 Looper.prepareMainLooper...原理简介 ---- Handler 主要作用是 , 用于 线程间通信 , 在线程 A 中创建 Handler , 在其它线程中使用 Handler 对象发送消息给 A 线程的 MessageQueue...Looper.prepare()方法 , 该方法的作用是准备轮询器 , Looper 创建后 , 会放在 ThreadLocal 中 , 这是线程的变量表 , 每个线程都有一个线程 ThreadLocal
Looper、Handler、MessageQueue、Message概括来说就是:Looper负责的就是创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息...Message,然后回调相应的消息处理函数,而消息的创建者就是一个或多个Handler,执行完成一个消息后则继续循环。...默认情况下当我们创建一个新的线程的时候,这个线程里面是没有消息队列MessageQueue的。...//在主线程中创建mHandler,所以自动绑定主线程 private Handler mHandler = new Handler(){ @Override public...然后再回调创建该消息的Handler中的dispathMessage方法。
关于 Handler 的 FAQ 单纯的在 onDestroy 移除消息并不保险,因为 onDestroy 并不一定执行。...Handler 还有其他知识点吗? 上一篇文章我挑选了 Handler 的基本原理以及一些非常常用的知识点进行突破讲解,很多同学说非常好,非常有帮助,其实我的目的已经达到了。 那么还有什么没讲的么?...当然有的,比如 : Handler 的延时消息机制相关; Handler 的屏障相关; 异步的 Message 相关; 应该还有些我不太了解的。
是开发人员自己实例化的可以创建多个。...而其他子线程需要调用上述两个方法才能使用Handler。...Handler中的同步屏障 插入了一个target为null的消息。Handler通过mAsynchronous来设置发送的是否为同步消息,创建Handler的时候可以传入boolean值修改。...nativePollOnce 具体链接:https://www.kancloud.cn/alex_wsc/android-deep3/416265 Hnadler内存泄漏 匿名内部类会默认持有外部类的引用,而创建...Handler如果为匿名内部类的话会有内存泄漏的隐患:Handler拿着Activity的引用,Message中target属性拿着Handler的引用,MessageQuene又拿着Message的引用
前言 Handler是Android开发中,使用非常多的一个类。关于它的坑也不少。我们使用它最多的场景就是非UI线程更新UI。也就是说我们把它当作线程间通信的工具。...---- Handler构造方法: Handler.java: public Handler() { this(null, false); }...handler = new Handler(); } }).start(); 便会抛出异常。...---- 综上,我们阅读了Handler一整套消息处理的流程。它为我们在线程间的通信提供了很大的方便。其中一些设计的思想也非常值得学习。...以上便是Android中Handler的工作原理。
这个变量实际上是提供一组回调函数指针,这些函数有在创建存储配置信息的对象的函数,也有在创建前和创建后会调用的函数。这些函数都将被nginx在合适的时间进行调用。...postconfiguration: 在创建和读取该模块的配置信息之后被调用。 create_main_conf: 调用该函数创建本模块位于http block的配置信息存储结构。...create_srv_conf: 调用该函数创建本模块位于http server block的配置信息存储结构,每个server block会创建一个。该函数成功的时候,返回创建的配置对象。...create_loc_conf: 调用该函数创建本模块位于location block的配置信息存储结构。每个在配置中指明的location创建一个。该函数执行成功,返回创建的配置对象。...那如果,在类似create_loc_conf这样的函数中,对创建出来的配置信息的值,没有设置为合理的值的话,后面用户又没有配置,就会出现问题。
Android的UI是运行在主线程中,主线程是用MainLooper来管理,循环读取MessageQueue队列中消息的,如果创建Handler对象new Handler( )时构造的时候参数没有指定绑定的...作为参数传递给我们构造的Handler对象;这样我们创建的Handler对象就和此thread线程的Looper绑定起来; 3、此时我们创建的Handler对象就可以给thread的MessageQueue...而在我们创建handler对象的时候,必须指定handler绑定的线程的looper。...如果在主线程创建handler对象,没有指定主线程looper时,系统会帮我们默认指定,将主线程的looper绑定到handler对象; 如果在非主线程中创建handler对象,没有指定线程的looper...我发现的handler的post的run函数运行在子线程,确定肯定是此handler对象创建时它的looper参数在创建的时候被在子线程中设置了,looper参数传的子线程的looper才会出现这种现象
转载请注明出处 作者:developerHaoz Github 地址:developerHaoz 本文的主要内容 Handler 是什么 Handler 的两个体系 Message 一、Handler...是什么 Handler 是 Android 中引入的一种让开发者参与处理线程中消息循环的机制,Handler直接继承自 Object,每个 Handler 都关联了一个线程,每个线程内部都维护了一个消息队列...这样就可以通过 Handler 将 Message 和 Runnable 对象发送到该Handler所关联线程的 MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个 Message...,除此之外,Handler 还可以做其他很多的事情,Handler 是 Thread 的代言人,是多线程之间通信的桥梁,通过 Handler,我们可以在一个线程中控制另一个线程去做某些事 二、Handler...的使用 Android -- 多线程之 Handler
简单翻一下: Handler是一个可以通过关联一个消息队列来发送和处理消息,发送或处理Runnable对象的一个处理程序,每个Handler都关联一个单个的线程和消息队列,当你创建一个新的Handler...即当一个进程被应用程序创建时,它的主线程会运行一个消息队列负责管理它创建的高层应用程序对象(如Activity、Broadcast Receiver等)和任何它的窗口创建的对象,你可以通过一个Handler...,创建自己的线程来实现与主线程之间的交互,但前提是你得在你的线程重写sendMessage方法并写上一行行代码,这样你给定的Runnable或者Message将被MessageQueue(消息队列)预定...与消息循环的交互是通过Handler类 下面这个是一个典型的Looper线程实例,它使用prepar()和loop()的分割来创建一个初始的Handler与Looper进行通信。...由Android环境来创建应用程序的主Looper。因此这个方法不能由咱们来调用。
handler是什么?...handler是Android提供用来更新UI的一套消息机制,也是一套消息处理的机制(发送和处理消息) handler原理 handler负责消息发送,looper负责接收handler发送过来的消息,...thread"); } sThreadLocal.set(new Looper(quitAllowed)); } 默认情况下ThreadLocal是没有存储的,所以要创建一个新的...image.gif 默认情况下ThreadLocal是没有存储的,所以要创建一个新的looper private Looper(boolean quitAllowed) { mQueue...image.gif 从looper方法中,创建了一个MessageQueue,在looper中维护着一个消息队列 知道了looper和MessageQueue之后,究竟handler跟这两者有什么关系呢
0x12 为什么要使用Handler 当一个应用程序运行时,它会创建一个进程。这个进程就是我们的主线程(UI线程&Activity Thread) 。...在主线程中,会默认为我们在系统中默认创建一个Looper,这个Looper会与我们的Message Queue 和 主线程有一定联系。...Android在设计的过程中,就封装了一套消息创建、传递、处理的机制。如果不遵循这样的机制,是没有办法更新UI信息的,会抛出异常信息。...当我们想要在其他线程更新UI时,就可以用主线程中创建的Handler调用sendMessage方法,然后在该Handler重写的handleMessage方法中做相应的处理。...可以这样做:在主线程中创建一个Handler。然后在子线程中,我们可以调用Handler的post方法,并向其中传递一个Runnable为参数,在Runnable中更新UI即可。
领取专属 10元无门槛券
手把手带您无忧上云