<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[问道]]></title><description><![CDATA[人生就是一场修行，朝闻道，夕死可矣]]></description><link>https://blog.youkuaiyun.com/quwei3930921</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; quwei3930921]]></copyright><item><title><![CDATA[基于Netty实现Mqtt客户端（六）-发布消息]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/121632443</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/121632443</guid><author>quwei3930921</author><pubDate>Tue, 30 Nov 2021 14:39:26 +0800</pubDate><description><![CDATA[引言
万事俱备，就欠发布消息了。前面的文章中，我们已经完成mqtt的连接、心跳、订阅、取消订阅处理，剩下就只有如何发布消息了。

]]></description><category></category></item><item><title><![CDATA[基于Netty实现Mqtt客户端（五）-订阅/取消订阅]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/121629734</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/121629734</guid><author>quwei3930921</author><pubDate>Tue, 30 Nov 2021 13:08:18 +0800</pubDate><description><![CDATA[引言
我们在完成连接相关实现后，就可以接收其他客户端发送的消息了。客户端之间的消息通讯通过以下方式实现：

客户端A向服务端订阅主题T；
客户端B向服务端发送消息，并指定该消息是发给主题T的；
服务端查看谁订阅了主题T，转发该消息给所有订阅主题T的客户端。

订阅主题
/**
 * 订阅主题
 *
 * @param qos    0-至多发1次
 *               1-至少送达1次
 *               2-完全送达并回应
 * @param topics 主题集
 * @thr]]></description><category></category></item><item><title><![CDATA[基于Netty实现Mqtt客户端（四）-心跳]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/120746070</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/120746070</guid><author>quwei3930921</author><pubDate>Wed, 13 Oct 2021 16:42:40 +0800</pubDate><description><![CDATA[引言
我们在成功建立mqtt连接后，会发现客户端在经过一段时间后被服务端主动关闭连接，这是因为我们未按照mqtt协议定时发送心跳给服务器造成的。
客户端需要发送PINGREQ报文给服务端，用于：

在没有任何其它控制报文从客户端发给服务的时，告知服务端客户端还活着
请求服务端发送响应PINGRESP确认它还活着
使用网络以确认网络连接没有断开

发送心跳
private void startPingTask() {
    if (channel == null)
        return;

    ]]></description><category></category></item><item><title><![CDATA[基于Netty实现Mqtt客户端（三）-创建连接]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/120696517</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/120696517</guid><author>quwei3930921</author><pubDate>Mon, 11 Oct 2021 10:01:56 +0800</pubDate><description><![CDATA[如何创建mqtt连接
要建立一个mqtt连接，分两个步骤：

创建socket长连接
发送连接报文（mqtt协议）

创建长连接
private void doConnect(MqttConnectOptions options, long timeout) throws Exception {
	// 创建连接
	EventLoopGroup group = new NioEventLoopGroup();
	connectTask = new AsyncTask&lt;String&gt;() {
	 ]]></description><category></category></item><item><title><![CDATA[基于Netty实现Mqtt客户端（二）-使用netty-mqtt-client]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/120503331</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/120503331</guid><author>quwei3930921</author><pubDate>Mon, 27 Sep 2021 10:31:45 +0800</pubDate><description><![CDATA[netty-mqtt-client
关于
基于netty实现的mqtt客户端，可用于Java、Android环境。持续开发中，现已完成基本框架及功能，目前仅支持qos1级别通讯，后期根据需要再开发qos2、qos3级别。
如何使用
Gradle：
repositories {
    mavenCentral()
}

dependencies {
    implementation 'io.github.x2ge:netty-mqtt-client:2.0.2'
}

连接
MqttClient mqt]]></description><category></category></item><item><title><![CDATA[基于Netty实现Mqtt客户端（一）-环境搭建]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/120482442</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/120482442</guid><author>quwei3930921</author><pubDate>Sun, 26 Sep 2021 10:06:39 +0800</pubDate><description><![CDATA[前言
在Android开发中，之前一直使用org.eclipse.paho.client.mqttv3包来开发mqtt客户端，随之就遇到了线程不回收的难搞问题，还伴随其他一些莫名其妙的问题。事实教育我，mqttv3虽然用的人多，却并不稳定。后面无意中发现了Netty框架，一个实现了大量网络协议的框架，于是就基于Netty实现了mqtt客户端。
环境搭建
要开发一个mqtt客户端，我们首先就需要搭建一个完整的mqtt通讯环境。
服务器：EMQX
下载windows压缩包并解压：
https://www.emq]]></description><category></category></item><item><title><![CDATA[Java笔记之线程池]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/107034622</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/107034622</guid><author>quwei3930921</author><pubDate>Tue, 30 Jun 2020 17:28:58 +0800</pubDate><description><![CDATA[什么是线程池？
我们可以将java的线程池简单的理解为一个带容器的工具类，提供线程创建、线程重用、线程销毁、任务管理等功能。
为什么要使用线程池？
在java虚拟机运行过程中，创建线程的代价是昂贵的。
系统中的每个进程有自己独立的内存空间，而线程也同样需要。在JVM中默认一个线程需要使用256k~1M的内存，这取决于32位还是64位操作系统，具体数值不必深究，随着JVM版本的变化，这个默认值可能发生变更，我们只需要知道线程创建是需要申请并占用内存的。
使用常规方式new Thread()创建线程，除了增加创]]></description><category></category></item><item><title><![CDATA[Android笔记之SeekBar的使用及问题]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/106250509</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/106250509</guid><author>quwei3930921</author><pubDate>Thu, 21 May 2020 10:28:07 +0800</pubDate><description><![CDATA[常用方式
在xml中直接添加，个人比较倾向于使用支持包中的AppCompatSeekBar控件：
    &lt;android.support.v7.widget.AppCompatSeekBar
        android:id="@+id/seekBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="0dp"
        android:layout_height=]]></description><category></category></item><item><title><![CDATA[Android笔记之解决OkHttp解析dns超时时间无法设置的问题]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/85336552</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/85336552</guid><author>quwei3930921</author><pubDate>Sat, 29 Dec 2018 12:07:16 +0800</pubDate><description><![CDATA[## 问题
使用OkHttp，设备切换路由后，访问网络出现长时间无响应，很久以后才抛出UnknownHostException. 这明显不是我们想要的，我们设置的connectTimeout属性似乎对dns的解析不起作用


...]]></description><category></category></item><item><title><![CDATA[Android笔记之分别使用Android、Java方式获取应用签名]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/79697976</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/79697976</guid><author>quwei3930921</author><pubDate>Mon, 26 Mar 2018 14:44:10 +0800</pubDate><description><![CDATA[一、通过Android方式获取应用签名

使用Android的方式获取签名主要通PackageInfo类直接获取：

    /**
     * 获取指定应用的签名
     *
     * @param packageName 包名
     * @return 应用对应签名
     */
    private String getSign(String packageName) {
 ...]]></description><category></category></item><item><title><![CDATA[Android笔记之使用CMake进行JNI开发（Android Studio）]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/78820991</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/78820991</guid><author>quwei3930921</author><pubDate>Sat, 16 Dec 2017 18:26:45 +0800</pubDate><description><![CDATA[不知道有多少朋友像我一样，被Android NDK开发的环境配置折腾到吐，然后放弃。从事Android工作几年了，也不太愿意接触NDK开发。不过福利终于来了，新的AS中开始使用CMake开发jni，开发c跟开发java一样简单，你只需单纯的执着于业务目标，跟折腾环境说拜拜。那我们现在就开始吧！环境需求要进行jni开发，AS需要以下环境： 
方式一、在工程创建的时候添加首先使用AS(3.0)新建一个J]]></description><category></category></item><item><title><![CDATA[Android笔记之快速简单的适配]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/78204654</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/78204654</guid><author>quwei3930921</author><pubDate>Wed, 11 Oct 2017 15:54:44 +0800</pubDate><description><![CDATA[大家都知道，做android开发适配屏幕是回避不了的问题，大量的xml布局、values文件、不同分辨率的图片让我们头疼，我们也一直在思考有没有一种方法直接改变缩放比例可以一次完成适配。那么，我们开始试试吧。    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    public static void initDpi(Context context]]></description><category></category></item><item><title><![CDATA[Android笔记之获取apk文件信息、图标]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/70260632</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/70260632</guid><author>quwei3930921</author><pubDate>Thu, 20 Apr 2017 15:31:11 +0800</pubDate><description><![CDATA[有的时候我们需要直接过去指定路径的apk信息，比如包名、应用名、图标等。/**  
* 获取apk包的信息：版本号，名称，图标等  
* @param absPath apk包的绝对路径  
* @param context   
*/    
public void apkInfo(String absPath,Context context) {        PackageManager pm]]></description><category></category></item><item><title><![CDATA[Android笔记之利用系统权限下命令安装apk]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/70254814</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/70254814</guid><author>quwei3930921</author><pubDate>Thu, 20 Apr 2017 09:24:16 +0800</pubDate><description><![CDATA[我们在定制Android系统的时候，应用商店是很重要的部分，市面上大部分的应用商店都采用了静默安装的方式来安装升级应用，这是怎么做到的呢？两点： 
1.具有系统权限 
2.使用pm install来安装    /** 
     * 静默安装的实现类，调用install()方法执行具体的静默安装逻辑。 
     */  
    public class SilentInstall {]]></description><category></category></item><item><title><![CDATA[Android笔记之获取文件存储]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/69388987</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/69388987</guid><author>quwei3930921</author><pubDate>Thu, 06 Apr 2017 14:03:19 +0800</pubDate><description><![CDATA[有时候我们需要获取应用的缓存目录，然后在该目录下存储下载文件    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    public String getDiskCacheDir(Context context) {
        String cachePath = null;
        if (Environment.MEDIA_MOUNTED]]></description><category></category></item><item><title><![CDATA[Android笔记之获取apk文件包名、版本信息]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/69388855</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/69388855</guid><author>quwei3930921</author><pubDate>Thu, 06 Apr 2017 13:50:35 +0800</pubDate><description><![CDATA[有时候我们需要直接获取sd卡上的apk文件的包名、版本等信息                PackageManager pm = this.getPackageManager();
                PackageInfo info = pm.getPackageArchiveInfo(task.filePath,
                        PackageMan]]></description><category></category></item><item><title><![CDATA[android笔记之安全开发之使用HTTPS]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/68922749</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/68922749</guid><author>quwei3930921</author><pubDate>Fri, 31 Mar 2017 10:56:27 +0800</pubDate><description><![CDATA[1、HTTPS简介阿里聚安全的应用漏洞扫描器中有证书弱校验、主机名弱校验、webview未校验证书的检测项，这些检测项是针对APP采用HTTPS通信时容易出现风险的地方而设。接下来介绍一下安全使用HTTPS的相关内容。1.1 为何需要HTTPSHTTP协议是没有加密的明文传输协议，如果APP采用HTTP传输数据，则会泄露传输内容，可能被中间人劫持，修改传输的内容。如下图所示就是典型的APP HTTP]]></description><category></category></item><item><title><![CDATA[Android笔记之签名相关]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/58593610</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/58593610</guid><author>quwei3930921</author><pubDate>Tue, 28 Feb 2017 17:01:14 +0800</pubDate><description><![CDATA[1.生成签名文件 
利用java的keytool可以完成。安装jdk之后配置好环境变量，在控制台下输入keytool出现以下信息： 
 
生成签名文件：keytool -genkey -v -keystore highball-key.keystore -alias highball-key -keyalg RSA -keysize 2048 -validity 10000-keystore 将生成]]></description><category></category></item><item><title><![CDATA[Android笔记之获取文件MimeType]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/58590529</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/58590529</guid><author>quwei3930921</author><pubDate>Tue, 28 Feb 2017 12:26:53 +0800</pubDate><description><![CDATA[在Android中获取文件TimeType主要通过MimeTypeMap的getFileExtensionFromUrl、getMimeTypeFromExtension方法    private String getMimeType(String filePath) {
        String ext = MimeTypeMap.getFileExtensionFromUrl(filePat]]></description><category></category></item><item><title><![CDATA[Android笔记之圆角布局]]></title><link>https://blog.youkuaiyun.com/quwei3930921/article/details/52604774</link><guid>https://blog.youkuaiyun.com/quwei3930921/article/details/52604774</guid><author>quwei3930921</author><pubDate>Wed, 21 Sep 2016 17:52:13 +0800</pubDate><description><![CDATA[有时候我们在android布局的时候需要这样一种布局，这个布局左上、右下是圆角的，左下、右上是直角，而且不管你内部如何放置view，它都能维持这样的整体效果。 
如图： 
 
图片中上面部分是ImageView，下面部分是TextView，可以看出左上、右下被自然的圆角化了，这其中并未对ImageView、TextView做任何处理，下面我们就来看看如何实现这一布局。

我们需要选择需要的四大布局]]></description><category></category></item></channel></rss>