首页
工具
隐私协议
App Privacy Policy
更多
作品
关于我们
Search
1
android5遇到INSTALL_FAILED_DEXOPT 解决办法
1,664 阅读
2
设置max_connections无效
1,484 阅读
3
FlexboxLayout+recyclerView实现自动换行
1,374 阅读
4
Nginx配置多个域名
1,257 阅读
5
Android P http网络请求失败
1,230 阅读
默认分类
mysql
android
android深入
Jetpack Compose
Android传感器
php
Yii2
windows
webrtc
登录
Search
标签搜索
android
kotlin
webrtc
kurento
mysql
adb
nginx
flutter
rsa
微信
git
Yii2
md5
加密
dart
aes
wechat
windows
小程序
dexopt
Typecho
累计撰写
80
篇文章
累计收到
3
条评论
首页
栏目
默认分类
mysql
android
android深入
Jetpack Compose
Android传感器
php
Yii2
windows
webrtc
页面
工具
隐私协议
App Privacy Policy
作品
关于我们
搜索到
4
篇与
小虫
的结果
2020-04-22
深入理解Looper
先看一个Looper使用范例:class LooperThread extends Thread{ public Handler mHandler; public void run(){ Looper.prepare(); mHandler = new Handler(){ public void handleMessage(Message msg){ //处理消息 } }; Looper.loop();//进入主循环 } }这段代码有三个步骤:1.Looper的准备工作(prepare)2.创建handler3.Looper开始动行(loop)这里会有些疑问,Looper的对象是怎么创建的;handler是如何把message传给MessageQueue的。查看Looper代码,里面有个非常重要的成员变量static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();这是一个静态常量,一旦import了Looper,sThreadLocal就会构建完毕。ThreadLocal对象是一种特殊的全局变量,因为它的“全局”性只限于自己所在的线程,而外界所有线程无法访问它,这也说明了每个线程的Looper都是独立的。在Looper.prepare中sThreadLocal会创建一个Looper对象。private static void prepare(boolean quitAllowed){ if(sThreadLocal.get() != null){ throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); }接下来创建一个Handler对象public Handler mHandler; mHandler = new Handler(){ public void handleMessage(Message msg){ ... } };handler根据构造函数跟Looper关联起来的,比如:public Handler(); public Handler(Callback callback); public Handler(Looper looper); public Handler(Looper looper,Callback callback);这里来看下第一个构造函数public Handler(){ ...//省略部分代码 mLooper = Looper.myLooper();//还是通过sThreadLocal.get来获取当前线程中的Looper实例 ... mQueue = mLooper.mQueue;//mQueue是Looper与Handler之间沟通的桥梁 mCallback = null; } 这样Handler和Looper,MessageQueue就联系起来了,后续handler执行Post/Send两个类型的函数时,会将消息传递到mQueue中,一旦Looper处理到这一消息,它又会从中调用Handler来进行处理。
2020年04月22日
215 阅读
0 评论
0 点赞
2020-04-21
Handler是如何传递消息的
先认识下跟Handler有关的几个类:MessageQueue,Message,Runnable,Looper。Runnable和Message可以被传入某个MessageQueue中;Looper不断地从MessageQueue中取出Object然后传给Handler进行处理,依次循环,如果队列为空,就会进入休眠;Handler利用自身的处理机制对传入的Object进行相应的处理。认识这几个类后,再了解下Handler和Thread的关系一个Thread对应一个Looper;一个Looper对应一个MessageQueue;一个MessageQueue对应N个Message;一个Message中对应一个Handle来处理事件;由此可以看出,Thread和Handler是一对多的关系;而Handler主要有两个功能,处理message和将message传入MessageQueue中。Looper从MessageQueue中取出一个Message后,首先会调用Handler.dispatchMessage进行消息分发,默认情况下Handler的分发流程是:Message.callback(Runnable obj) 如果不为空会优先调用callback处理Handler.mCallback 如果不为空会调用mCallback.handleMessage如果以上两个对象都不存在,则会调用Handler.handleMessage如果项目中有需要改变handler的默认行为,可以重载dispatchMessage或handleMessage。Handler发送消息有两种方式,分别是post和send,这两种方式都是负责将message传入MessageQueue,区别在于send处理的参数直接是message,而post需要先把其它信息转换成message,再调用send来执行下一步,看源码:public final boolean post(Runnable r){ return sendMessageDelayed(getPostMessage(r),0); }因为调用时会传一个Runnable对象,post需要先将其封装成一个Message,接着通过对应的send把它传到MessageQueue里。private static Message getPostMessage(Runnable r){ Message m=Message.obtain();//Android系统会维护一个全局的Message池,当用户需要使用Message时,可以调和obtain获得,不用去自行创建,这样可以避免不必要的资源浪费 m.callback=r;//将Runnable对象设置为Message的回调函数 return m; }拿到Message后,再调用sendMessageDelayed来发送消息,这个函数可设置多长时间后再发送,在其内部又调用sendMessageAtTime来发送。public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException(this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); return false } msg.target = this; return enqueueMessage(queue,msg,uptimeMillis);//将message传入MessageQueue }这样就将一条由Runnable组成的Message通过Handler成功传入MessageQueue。
2020年04月21日
275 阅读
0 评论
0 点赞
2020-04-13
mysqldump备份及还原(gzip压缩)
备份mysqldump -hhostname -uusername -ppassword databasename | gzip > databasename`date +%Y%m%d`.sql.gz还原gunzip < databasename20200410.sql.gz | mysql -uroot -proot databasename
2020年04月13日
291 阅读
0 评论
0 点赞
2020-04-10
Nginx配置多个域名
在Nginx配置目录下,创建一个vhost目录。我的配置目录在/etc/nginxmkdir /etc/nginx/vhost创建网站a的配置文件vi /etc/nginx/vhost/vhost_a.confserver配置server { listen 80; server_name www.a.com; root /var/www/html/a; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html{ root /usr/share/nginx/html; } location ~ .*\.php(\/.*)*$ { fastcgi_split_path_info ^(.+?.php)(/.*)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 同样创建网站b的配置文件,server_name和root改成对应的即可;然后编辑nginx.conf文件。vi /etc/nginx/nginx.conf在http里加入以下内容,再重启Nginx.http { ... include /etc/nginx/vhost/vhost_*.conf; }
2020年04月10日
1,257 阅读
0 评论
0 点赞