首页
工具
隐私协议
App Privacy Policy
更多
作品
关于我们
Search
1
android5遇到INSTALL_FAILED_DEXOPT 解决办法
1,641 阅读
2
设置max_connections无效
1,481 阅读
3
FlexboxLayout+recyclerView实现自动换行
1,336 阅读
4
Nginx配置多个域名
1,253 阅读
5
Android P http网络请求失败
1,224 阅读
默认分类
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
作品
关于我们
搜索到
7
篇与
php,mysql,android
的结果
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日
214 阅读
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日
274 阅读
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,253 阅读
0 评论
0 点赞
2020-04-10
Android P http网络请求失败
最近更新了android studio,以及到gradle和android sdk版本 ;手机Pixel 2 xl,系统Android P;网络请求okhttp3,每次网络请求总是:java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy官网文档:Android致力于保护用户,他们的设备和数据安全。我们保证数据安全的方法之一是保护所有进入或离开Android设备的数据在传输中使用传输层安全性(TLS)。正如我们在Android P开发人员预览中所宣布的那样,我们通过阻止针对Android P的应用程序默认允许未加密的连接来进一步改进这些保护。这是我们多年来为更好地保护Android用户而做出的各种更改。为了防止意外的未加密连接,我们android:usesCleartextTraffic在Android Marshmallow中引入了manifest属性。在Android Nougat中,我们通过创建Network Security Config功能扩展了该属性,该功能允许应用程序指示他们不打算在没有加密的情况下发送网络流量。在Android Nougat和Oreo中,我们仍然允许明文连接。看来以后都要用https了,在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。目前找到的解决办法:1:改用https2:targetSdkVersion改为27以下3:在res的xml目录下,新建一个xml文件(名称自定义,如:network_security_config.xml),内容如下:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config><application ... android:networkSecurityConfig="@xml/network_security_config" ... />更多参考:https://android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html原文:https://www.jianshu.com/p/fb7374b544aa
2020年04月10日
1,224 阅读
0 评论
0 点赞
2020-04-10
设置max_connections无效
在/etc/mysql/my.cnf中设置max_connections=512进入Mysql查看发现还是214mysql> show global variables like '%max_connecti%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 214 | +-----------------+-------+ 1 row in set (0.01 sec)google了一番后,说是跟open_files_limit有关,每个connect都会打开几个文件,查了下open_files_limit为1024。mysql> show global variables like '%open_files_limit%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 1024 | +------------------+-------+ 1 row in set (0.00 sec)在/etc/mysql/my.cnf中加上open_files_limit = 4096重启mysql后查看mysql> show global variables like '%max_connecti%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 512 | +-----------------+-------+ 1 row in set (0.01 sec)mysql> show global variables like '%open_files_limit%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 4096 | +------------------+-------+ 1 row in set (0.00 sec)open_files_limit最大值也是有限制的,设置太大也会变成默认1024,可以在/etc/security/limits.conf加上并重启系统* soft nofile 65536 * hard nofile 65536还有就是启动mysql的service加上LimitNOFILE=65535并重启mysql,这样可以解除open file的限制,LimitNOFILE=65535
2020年04月10日
1,481 阅读
0 评论
0 点赞
2020-04-09
Typecho安装后无法登录
说一下今天搭建Typecho遇到的问题,初始化时提示我要手动创建config.inc.php,手动创建后还是不能安装,Google了下找到原因了,是没有授权.chmod -R 777 /var/www/html授权后安装成功,也看到了"欢迎使用 Typecho",但是登录控制台时总是失败,无提示,直接跳回登录页。又是一番Google,原因是因为开启了https,需要在config.inc.php中加入一行:/** 开启HTTPS */ define('__TYPECHO_SECURE__',true);
2020年04月09日
1,066 阅读
0 评论
0 点赞