<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ForMuHan的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ForMuHan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ForMuHan]]></copyright><item><title><![CDATA[Message: ‘chromedriver’ executable needs to be in PATH.]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/120845360</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/120845360</guid><author>ForMuHan</author><pubDate>Tue, 19 Oct 2021 14:18:35 +0800</pubDate><description><![CDATA[出现这个报错信息，原因是版本号不对应

解决办法：
安装与浏览器版本匹配的webdriver
1、打开谷歌浏览器， 在地址栏输入chrome://version/查看版本信息：

2、从http://npm.taobao.org/mirrors/chromedriver/下载版本

3、将chromedriver.exe放到指定路径
...]]></description><category></category></item><item><title><![CDATA[全国各地市乡镇数据]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/115720147</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/115720147</guid><author>ForMuHan</author><pubDate>Thu, 15 Apr 2021 11:43:30 +0800</pubDate><description><![CDATA[如题，java操作Excel，读取数据，写数据。参考博客地址：https://blog.youkuaiyun.com/cpcpcp123/article/details/82763937



public class Excel {
    public static void main(String[] args) {
        try {
            //获取指定行的值
            readSpecifyRows(new File("F:\\ry2.xls"));
        }]]></description><category></category></item><item><title><![CDATA[20201124java基础知识整理]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109849204</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109849204</guid><author>ForMuHan</author><pubDate>Fri, 20 Nov 2020 18:37:09 +0800</pubDate><description><![CDATA[JDK JRE JVM关系

JDK是java开发工具包，包含java开发工具（编译工具javac.exe，运行工具java.ext）和JRE
JRE是java运行环境，包含JVM和java所需核心类库。只需要JRE就可以运行开发好的java程序
JVM是java虚拟机，是虚构出来的计算机，是通过仿真各种实际计算机实现的。java的跨平台就是建立在jvm的基础上，任何平台只要装有针对该平台的虚拟机，就可以执行编译好的字节码文件。这就是“一次编译，多次运行”。


java运行原理

通过javac编译我们编]]></description><category></category></item><item><title><![CDATA[组件化开发Aroute原理简析]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109602357</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109602357</guid><author>ForMuHan</author><pubDate>Tue, 10 Nov 2020 18:11:35 +0800</pubDate><description><![CDATA[对组件化开发的基本认识中，各个模块之间的通讯方式明显不能满足项目需求，此时就需要一个通讯框架实现模块之间的通讯。框架的意义就在于实现解耦的前提下，能够让各组件之间完成通讯。所以简单学习了一个Aroute框架权当记录，错误的地方还请指正
本demo设置了主程序和登录模块，一些基本的配置，例如library开关，manifest设置等本文就不再描述，直接简述Aroute的流程

创建ArouteLibrary依赖库，让主程序和登录模块依赖此项目
public class Aroute {
//    存放key]]></description><category></category></item><item><title><![CDATA[微信小程序常用功能所需条件整理]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/108710380</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/108710380</guid><author>ForMuHan</author><pubDate>Tue, 10 Nov 2020 16:45:53 +0800</pubDate><description><![CDATA[商户号开通：

如果用户有商户号，请提供api、mchId和安全证书
告知用户，如果商户号超过3个月没有流水记录，会被微信限制支付
我们重新申请商户号时间约7个工作日（没申请过商户号，具体资料未知）
微信商户号申诉时，有效期填写公司成立日期，不要写营业执照右下角日期（切记）

小程序申请：

名称需要微信认证后才能使用（用户可提供多个名字，看微信审核情况）
修改名字需要300元认证费用（特殊词汇需要软著或其他证明文件，时间根据具体情况）
需要营业执照、法人身份证正反面照片、公司对公账户和开户行信息（需要往微]]></description><category></category></item><item><title><![CDATA[Android Studio通过无线的方式连接手机调试]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109530503</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109530503</guid><author>ForMuHan</author><pubDate>Fri, 06 Nov 2020 14:06:59 +0800</pubDate><description><![CDATA[查看当前连接的设备
打开Android Studio的terminal工具，输入: adb devices
指定端口
输入命令adb tcpip + 端口号(端口号是随意指定的，只要不会冲突没有被占用。一般我们使用5555)
连接手机
输入命令adb connect+手机IP:端口号,显示connect to输出即为连接成功。即可直接操作了

...]]></description><category></category></item><item><title><![CDATA[OKHTTP内部流程]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109513266</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109513266</guid><author>ForMuHan</author><pubDate>Thu, 05 Nov 2020 16:56:06 +0800</pubDate><description><![CDATA[最近无聊看了一下OKHTTP源码，大致了解了一下我们使用OKHTTP发送网络请求之后，内部都发生了什么。简单说一下哈
我们正常发送一个get请求如下
 OkHttpClient client = new OkHttpClient();
 Request request = new Request.Builder().get().url(url).build();
 client.newCall(request).enqueue(new Callback() {
     @Override
     pub]]></description><category></category></item><item><title><![CDATA[我理解的Handler内部流程]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109381936</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109381936</guid><author>ForMuHan</author><pubDate>Fri, 30 Oct 2020 12:00:37 +0800</pubDate><description><![CDATA[线程/Handler/Looper/MessageQueue/Message之间的对应关系

一个线程对应一个Looper，一个Looper对应一个MessageQueue
一个线程可以对应多个handler，msg.target可以找到对应的handler。

主线程的Looper和loop()启动

主线程已经调用了Looper.prepareMainLooper(); Looper.loop();方法
Looper.prepareMainLooper(); 创建了一个Looper对象,并与当前线程绑定]]></description><category></category></item><item><title><![CDATA[fori和foreach的区别]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109362066</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109362066</guid><author>ForMuHan</author><pubDate>Thu, 29 Oct 2020 16:07:00 +0800</pubDate><description><![CDATA[直接上代码

ArrayList里边的foreach方法，归根结底还是调用了fori；
在刚开始id时候expectedModCount = modCount，但是如果进行了增删操作，那么modCount就会发生变化，expectedModCount ！= modCount就会抛出异常了

 @Override
    public void forEach(Consumer&lt;? super E&gt; action) {
        Objects.requireNonNull(action);]]></description><category></category></item><item><title><![CDATA[我理解的安卓组件化开发]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109327742</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109327742</guid><author>ForMuHan</author><pubDate>Wed, 28 Oct 2020 12:01:19 +0800</pubDate><description><![CDATA[安卓组件化开发的意义
当项目比较大需要多人协同开发的时候，组件化开发可以使大家分模块开发，并且不会互相影响。并且可以单独调试，不受其他模块制约。
项目结构解析
创建一个主应用，两个子应用（既可以做应用，也可以作为主应用的依赖），一个base库实现主应用和子应用的通讯。创建后项目结构如下

统一项目编译版本

gradle.properties文件设置统一版本

	# 统一编译版本等信息
	compile_Sdk_Version=28
	min_Sdk_Version=15
	target_Sdk_Versi]]></description><category></category></item><item><title><![CDATA[安卓线程池理解]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109154266</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109154266</guid><author>ForMuHan</author><pubDate>Mon, 19 Oct 2020 09:37:01 +0800</pubDate><description><![CDATA[线程池的使用场景
在安卓开发中经常会遇到处理多张图片，或者分片上传等需要使用多线程的情况，如果简单的通过new Thread创建线程，会造成线程的频繁创建和销毁，占用大量的资源。并且频繁的调用GC机制，这会使性能降低，又非常耗时。
常见的线程池分类
最基本的ThreadPoolExecutor
1 通过构造方法，创建最基本的线程池，这也是参数最多，允许用户自己设置
ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(
        2,]]></description><category></category></item><item><title><![CDATA[微信小程序 添加社交类目]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/109002032</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/109002032</guid><author>ForMuHan</author><pubDate>Sat, 10 Oct 2020 18:10:44 +0800</pubDate><description><![CDATA[微信小程序添加社交类目，需要上传《非经营性互联网信息服务备案核准》即icp备案文件

可以通过https://beian.miit.gov.cn/#/search/info查询
]]></description><category></category></item><item><title><![CDATA[微信小程序button样式设置不好的时候，去掉app.json中的v2]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/108768737</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/108768737</guid><author>ForMuHan</author><pubDate>Thu, 24 Sep 2020 10:40:25 +0800</pubDate><description><![CDATA[微信小程序button样式设置不好的时候，去掉app.json中的v2

]]></description><category></category></item><item><title><![CDATA[安卓 全屏模式下键盘遮挡底部输入框]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/106538851</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/106538851</guid><author>ForMuHan</author><pubDate>Thu, 04 Jun 2020 09:45:17 +0800</pubDate><description><![CDATA[废话不多说，直接上图显示bug,底部的输入框光标以下部分被遮挡了。



查了很多资料，有说必须使用RelativeLayout的等等说法。一行行代码注释后发现是因为全屏的问题。找到问题就好解决了，贴出大神代码，侵删


public class AndroidBug5497Workaround {

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use t]]></description><category></category></item><item><title><![CDATA[NestedScrollView默认不在最上方]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/106358529</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/106358529</guid><author>ForMuHan</author><pubDate>Tue, 26 May 2020 16:11:49 +0800</pubDate><description><![CDATA[android.support.v4.widget.NestedScrollView嵌套RecyclerView时，会遇到不显示最顶端内容，需要给NestedScrollView的子控件设置属性


android:descendantFocusability="blocksDescendants"


]]></description><category></category></item><item><title><![CDATA[Spring整合Mybatis]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/106144915</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/106144915</guid><author>ForMuHan</author><pubDate>Fri, 15 May 2020 17:06:46 +0800</pubDate><description><![CDATA[Spring可以存放我们的对象，Mybatis方便了我们与数据库交互。整合之后方便我们的开发

Spring整合Mybatis步骤
项目目录图

导入依赖

    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-jdbc&l.]]></description><category></category></item><item><title><![CDATA[我的Spring入门(二) 代理模式]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/106141642</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/106141642</guid><author>ForMuHan</author><pubDate>Fri, 15 May 2020 16:18:34 +0800</pubDate><description><![CDATA[我对代理模式的理解
工作中，公司祖传代码已经完成了所需功能，但是现在要求对所有的请求加日志。为了改动原有代码，避免出现不可预知的意外，就可以使用代理模式，也就是传说中的套娃娃。
代理的实现方式
首先来看基本需求
//service接口
public interface UserService {
    void add(String name);
    void delete();
    void update();
    void query();
}

//实现类
public class Us]]></description><category></category></item><item><title><![CDATA[我的Spring入门]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/106103660</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/106103660</guid><author>ForMuHan</author><pubDate>Wed, 13 May 2020 18:41:48 +0800</pubDate><description><![CDATA[这里写目录标题我对Spring的理解依赖注入DIxml注入自动注入
我对Spring的理解
我理解的Spring相当于一个大容器，存储用户需要的对象。两个核心思想IOC和AOP
IOC意思是控制反转，我的理解是在容器中放了各种各样的对象，这种思想的好处就是用户需要哪个对象，直接拿过来就能组装上。传统的思想是对容器中的对象按照需求进行更改，然后再组装。
IOC的思想极大的方便了程序员的开发，只关注业务层，找到自己需要的组件就可以了。不需要根据用户需求频繁的修改组件
AOP就是切片编程，可以在程序中加塞，做某种]]></description><category></category></item><item><title><![CDATA[我的Mybatis入门（四）整合Spring]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/105763354</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/105763354</guid><author>ForMuHan</author><pubDate>Sun, 26 Apr 2020 11:37:24 +0800</pubDate><description><![CDATA[为什么要整合Spring
我的想法：Spring可以帮我们管理对象，方便我们开发
整合步骤
创建项目，引入jar包
创建过程略，引入jar包如下图所示：

基本配置

创建User.class类

public class User {
   private int id;
   private String name;
   private int age;
   //省略get set toS...]]></description><category></category></item><item><title><![CDATA[我的Mybatis入门（三）一对一和一对多查询]]></title><link>https://blog.youkuaiyun.com/ForMuHan/article/details/105736374</link><guid>https://blog.youkuaiyun.com/ForMuHan/article/details/105736374</guid><author>ForMuHan</author><pubDate>Fri, 24 Apr 2020 18:23:27 +0800</pubDate><description><![CDATA[一对一查询（一个订单对应一个用户）
修改Order.class
Order.class添加用户信息
public class Order {
	private int id;
	private int userId;
	private int orderNo;
	private String address;

	private User user;
	
	@Override
	public St...]]></description><category></category></item></channel></rss>