自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 收藏
  • 关注

原创 ReadHub源码阅读笔记(二)dagger+MVP

先来思考一般的MVP模式,view层(活动和碎片)持有一个presenter实例,presenter通过构造器或set方法持有view引用。然后view层调用presenter方法,prensenter获取数据后调用view方法(界面操作)完成一次完整响应。引入dagger后view层不再需要手动实例化presenter,由框架注入即可,这就是区别。...

2018-06-11 13:28:58 857

原创 ReadHub源码阅读笔记(一)

ReadHub是一个开源的新闻阅读软件,下载apk的时候发现只有2M,但是用到的技术比较全面了。1.先来看看分包:自定义Application、启动页和主活动单独拿出来;base包放baseAty、baseFragment等;bean包放数据模型类,命名为xxxMo;ui包中按视图分类,每个页面为一个包,包含本页面的活动和自定义veiw,以及widget中放公共的自定义view。constant表...

2018-06-11 11:16:02 3144

原创 Android Studio突然打不开

删除最近配置的环境变量:_JAVA_OPTIONS心路历程:点击AS启动程序没反应,喵喵喵?上网搜答案,有说环境变量配置的问题,可是我以前能用啊,看了一下,JAVA_HOME,ANDROID_HOME都没问题啊(eclipse也打不开了)。接着卸载重装,无果,官网下载最新版重装,依然无果。然后我发现了一个环境变量_JAVA_OPTIONS,是我前几天装QTP的时候配置的,而我今天把QTP删了,指向...

2018-06-04 18:51:34 5377 3

原创 Glide进阶 定制target为view设置背景

into(Imageview image)是链式语法的最后一步,那么如果想要

2018-05-19 14:23:37 2669

原创 Volley设计剖析

在volley的一般使用中,首先使用Volley.newRequestQueue创建一个RequestQueue,然后new Request加入这个RequestQueue就可以了,request的参数中包含在主线程执行的回调方法等。所以重点来看看这个RequestQueue的设计。首先掌握RequestQueue中含有的几个属性:PriorityBlockingQueue<Request&...

2018-05-19 10:34:40 172

原创 Android studio快捷键学习(eclipse版)

磨刀不误砍柴工,熟练使用快捷键能大大提升开发效率,所以最近准备学一下android studio的快捷键。其实很多IDEA的快捷键是相通的吧,学好了就可以脱离鼠标。首先要明确as并不是只有一套快捷键,File--Settings--keymap,可以看到快捷键有很多个版本,供自由选择。可以看到这里我用的是eclipse版的。(其实别的IDEA我都没用过。。。)1.和ctrl+Z对应的是ctrl+Y...

2018-05-02 15:03:34 972

原创 linux安装VMware-tools

因为要用到主机和虚拟机之间的文件复制,所以需要安装VMware-tools1.添加驱动:相应虚拟机设置----添加---CD/DXD驱动器,一直下一步就添加好一个驱动了。2.安装VMware-tools:重启虚拟机,虚拟机右键---安装VMware-tools、可以看见一些文件出现在新添加的驱动文件夹中,这个文件夹是只读的,所以先全部复制到别的文件夹中。然后解压tar.gz文件:tar -xzvf...

2018-04-15 12:51:04 313

原创 ListView缓存机制简述

listview的缓存机制学习自郭霖大神的博客:https://blog.csdn.net/guolin_blog/article/details/45586553首先要知道listview是个什么东西,listview和gridview都继承自AbsListview,而AbsListview则是一个Viewgroup。Listview缓存中要用到一个类RecycleBin,这是AbsListVi...

2018-04-11 20:41:03 1743

原创 解压xz时gzip : stdin: not in gzip format

使用的命令:tar xzfv linux-3.2.101.tar.xz弹出信息表示该文件未使用gzip压缩,所以去掉xzfv中的z就可以了

2018-04-02 13:38:03 2550

原创 Silicompressor源码学习(一) 基本架构和图片压缩

偶然看到一篇博客上说Silicompressor这个图片视频压缩开源库很强大,正好想要研究研究图片视频压缩,就读一读源码。首先来看用法:String filePath = SiliCompressor.with(Context).compress(imageUriString, destinationFile);熟悉的链式语法,参数传入原图片uriString和压缩后图片存放的文件夹,返回压缩后图...

2018-03-26 20:17:49 3313 3

原创 Android/java EAN-13 数字码转条形码

我们都知道,条形码其实就是一大串的0101,存储了一个13位数字的信息,现在实现这么一个需求,根据用户输入的12位数字(第13位是校验位,可以根据前12位生成),转为条形码的01串,并画出来。先看编码规则:https://baike.so.com/doc/2185319-2312258.html  百科里最下面这个例子讲的很清楚了。自定义一个SurfaceView,只负责接收最终生成的Int集合并...

2018-03-23 14:26:53 2406 2

原创 Gradle和Android Studio学习

(一)依赖首先了解gradle中的六种依赖:1) compile:它是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。2) provided:它是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终的apk。3)   apk:只会打包到apk文件中,而不参与编译,所以不能在代...

2018-03-20 12:59:12 217

原创 (java)找出数组中和为K的一组解(动态规划)

考虑N个数的数组A中是否存在和为K的解,可以分为考虑(N-1个数中是否有和为K的解)或者(N-1个数中是否有和为K-A[N-1]的解(解包含A[N-1]的情况))。也就是说,动态规划方程是:P[N][K]=P[N-1][K]||P[N-1][K-A[N-1]];直接上代码:        //找出数组中和为K的一组解 public void Solve(int[] a,int k){ if ...

2018-03-01 20:00:42 3357

原创 求字符串第一个非重复字符+首尾相连数数字依次remove

1.给定一个字符串,求第一个不重复的字符,如: abbcad -> c我最开始想到的就是使用LinkedHashMap<Character,Integar>,一个保存了键值对放入顺序的HashMap。遍历字符串,当map中有该字符时其value加一,没有则放入(char,1)。而后遍历map的key集合,找出第一个值为1的即可。    public char a(String ...

2018-02-13 23:41:01 659

原创 java算法(三)迭代(非递归)实现二叉树的前序中序后序遍历

递归无疑是遍历二叉树最简洁的方式,其依赖的是函数栈,非递归实现的话只要通过栈的辅助就可以了。前序遍历:根节点首先入栈,然后栈中元素依次出栈,每次出栈时压入该元素的右孩子和左孩子(注意这个顺序,这样弹出时才是左孩子在前)public void frontPrint(BTree tree){ if (tree==null) { return; } Stack stac

2018-01-27 15:56:01 855

原创 山东大学模式识别实验(java)K-means算法

K-means是无监督学习,也就是说事先并不知道有几类,所有数据都是无标记的,所以虽然本实验的红酒数据集认为应该分为3类,但是对于k-means来说是没有意义的。每次分类前我们首先要人为指定分成K类,然后任意选取K个点作为K个类的中心点,遍历全集,离哪个中心近就认为是哪一堆的。接下来我们要验证所选中心点是否是真正的中心点,计算每一堆各个特征的平均值后得出的就是这一个类的中心,如果与我们认为的中心不

2018-01-13 20:59:26 1910

原创 山东大学模式识别实验(java)KNN算法

KNN算法就是把待分类数据放在训练集里找出离他最近的K个元素(欧氏距离),然后看看其中哪个类最多,就将这个元素分为这个类。在本实验中,使用数字数据集。每个数字含有一个二维数组表示其中的像素点,可以认为拥有M*N个特征,只不过每个特征只有0和1两种值,表示该像素点是否绘制。将下载的训练集和测试集放在项目根目录下,因为测试集中每个元素也是已标记数据,所以每次分类后可以判断分类是否正确,从而得出一个

2018-01-13 20:40:57 811 2

原创 山东大学模式识别实验(java)贝叶斯算法

贝叶斯算法,简单地说就是比较测试数据是各个类别的概率,概率最大的就判断为这个数据的类别。具体来说就是一个条件概率的计算,测试数据是X,某个类别是C,那么也就是求P(C|X)最大的C,等于P(X|C)P(C)/P(X),因为P(X)不变,所以不必引入计算。也就是说,比较的是P(X|C)P(C)。进一步,P(C)=C类数量/训练集总数,其中训练集总数不变,所以也可以忽略。P(X|C)=P(X1 | C

2018-01-13 20:24:45 676

原创 java算法(二)先序遍历和逐层遍历数据转二叉树

一般来说我们得到的先序遍历和逐层遍历的序列都不能转回二叉树,但是如果我们把叶子节点的null孩子也储存起来就可以,也就是把null看成叶子结点。这里用一个Integar链表来表示数据。先序遍历思路:递归为每个非null节点分配孩子节点。核心思想还是先序遍历。代码://先序遍历队列还原二叉树 public BinaryTreeNode generateTree(LinkedLi

2017-12-29 17:17:51 317

原创 java算法(一)二叉树逐层遍历打印(分层换行)

思路是维护一个节点队列和两个节点引用last(上一行最后的元素).nlast(本行最后的元素),初始化时nlast=last=root。不断取出队列第一个元素x,然后将x的左右孩子入队并移动nlast到最后一个孩子。然后判断x是否是last,是则打印并换行并将last指向nlast(开始下一行),否则普通打印。     文字描述不太清晰,结合程序走一遍就理解了。package structur

2017-12-29 16:07:01 4426 1

原创 NDK开发 (一)Hello World!

先导知识:1.JNI是java中调用其他语言的接口(在NDK开发中也就是调用C\C++),NDK是一组帮助java调用C\C++的工具,可以将so文件和java文件一起编入apk等。2.java运行在java虚拟机上,是跨平台的。但是C\C++是不跨平台的,根据CPU不同编译生成的so文件(动态链接库)也会不同。安卓中有7中CPU架构,如图,通过NDK工具我们可以快速编译生成这7中各自的s

2017-12-19 19:09:08 298

原创 intent-filter匹配与scheme跳转协议

用Intent进行活动及其他组件的启动有显式启动和隐式启动两种方式,显式不必多说,隐式就是在Intent里配置一些参数,然后去和整个系统中注册的组件(一般是activity)进行匹配,启动匹配成功的组件(匹配成功不止一个时全部显示让用户进行选择)。隐式启动可以方便的跨应用启动活动,在网页中启动等,用到的地方还是很多。匹配的依据是主配置文件中组件的子标签,可以不止一组,只要匹

2017-12-12 16:38:29 3558

原创 C语言实现Socket简单通信

环境是linux,不过应该没什么影响,因为只用到了socket的基本用法,没有涉及pthread等。分为服务器端和客户端,服务器端监听端口发来的请求,收到后向客户端发送一个Hello World,客户机负责发送消息并打印收到的Hello World.服务器步骤:建立socket,绑定socket和地址信息,开启监听,收到请求后发送数据。客户端步骤:建立socket,连接服务器端,接收并

2017-12-03 17:19:45 63896 24

原创 Kotlin 构造器和单例模式

class AA{ init { }}1.这是一个最简单的类,他没有在头部做任何构造器的声明,这时他拥有一个默认的无参构造器,而这个构造器的内容要放在init块中。如果构造器没有操作的话,init可以省略。如果不想暴露这个构造器,可以在声明时设为private:class AA private constructor()2.声明带参构造器

2017-10-28 21:10:45 1222

原创 kotlin委托属性+SharedPreference实例

委托属性就是将一个成员变量委托给一个类管理,这个类需要实现getValue和setValue。换言之,属性将自己的get和set方法委托给了这个类的getValue和setValue。这种模式适用于简化存取一个值的情况,比如说sharedpreference的操作,原来存取一个值我们需要初始化sp对象然后存取,借助这个委托可以用一行代码实现。先来看最简单的委托类,只需要实现getV

2017-10-26 16:32:05 3111 1

原创 对convertView和ViewHolder的理解

在使用listview和recyclerview的过程中免不了要用到convertview和viewholder,所以理解他们的工作原理还是很有意义的。首先来看listview的使用,如果要写一个最简单的BaseAdapter的话,那么getView中直接用LayoutInflater根据布局文件生成一个View,然后再获取这个view的子组件设置属性,返回这个view就可以了。但是这

2017-10-23 21:17:28 8136

原创 Android Studio查看包依赖关系+删除冲突框架版本(如glide)

最近遇到了一个问题,我引入了glide 3.7版本,在使用过程中却发现无法正常使用链式语法设置placeholder和error等,于是我打开项目.idea-->libiraries,发现目录下glide的版本是4.0,很明显,有别的框架依赖了4.0,那么我现在就需要找到这个框架。1.使用Gradle View查看依赖树:首先搜索Gradle View插件安装重启。然后View--

2017-10-22 11:16:04 11385

原创 Android 源码设计模式读书笔记 前四章

一、面向对象六大原则单一职责原则(SRP):一个类应该只负责一个部分,这个责任的划分并不明确,我的理解就是说不要把应该拆分的功能放在一个类里,从而松耦合,提高扩展性。具体理解还是要结合书上的托片加载器的例子。开闭原则(OCP):系统对扩展开放,对修改封闭。要在尽量不修改原有代码的基础上对功能进行扩展,也就要求代码有很高的可扩展性。其实这几个原则都是设计模式的共同目标,很多地方都能得到体现。

2017-10-20 21:58:48 380

原创 TextView文本可选中

android:textIsSelectable="true"

2017-10-11 21:48:40 3234

原创 Android Studio开发中途使用gitignore文件进行提交忽略

上回书说道,因为部分文件过大,常常会出现push失败的问题。对于整个安卓项目,需要进行push的部分其实很少,一般来说只有app文件夹和项目gradle文件等。git使用中有一个gitignore文件,可以通过在这个文件中写入所有想要忽略的文件夹和文件,这样的话被忽略的部分就不会随项目提交和push。这个文件在项目根目录下,叫做.gitignore,没有的话可以自己加上。但是如果你

2017-10-10 16:04:33 1037

原创 push was rejected by remote(因部分文件过大)(安卓)

最近项目变大之后Push到码云上的时候遇到了一个问题,如题所示,被拒绝,使用命令行进行push后明白了具体原因,是因为push限制单个文件不大于100M,而我有一个bin文件大于100M了。事实上,我是不需要push这个文件的,只需要push app文件夹,也就是代码部分。其实常见的思路是在gitignore文件中将这些文件忽略掉,然而我一顿操作发现没用,这些文件还是被提交了上去。。。。

2017-10-09 23:23:44 5057

原创 Picasso清空缓存策略(如更换头像)

最近在做一个看帖类的APP,帖子显示用户头像且头像可以修改。图片加载框架用的是Picasso,它自带缓存功能,默认情况下加载网络图片时会先从缓存中找,这可以大大节省加载时间。但是因为用户可以更改头像,更改头像后图片的地址是不变的,所以要求每次打开APP看帖的时候看到的就是最新的头像,刚开始我在Picasso的链式语法中加入这两行: .memoryPolicy(MemoryPolicy.NO_C

2017-10-01 19:03:24 1338

原创 Android Studio切换和合并分支branch

首先要理解开分支。默认情况下一个项目只有一个主分支,但是很多情况下需要开分支进行版本控制,最近我和小伙伴就发现版本控制很困难,需要进行开分支。如图,项目的主分支类似于一个链表,每次我们进行push的时候指针master也就移动到最新的位置。在主分支的最新节点开启一个新的分支后,在新的分支上进行的操作和主分支相同,不过并不会影响主分支。在我们自己开的dev分支上的工作编写完毕后,就可以把它合并到

2017-09-30 11:44:52 36768

原创 ViewPager禁止滑动切换和去除切换时动画效果

自定义ViewPager,简单修改几个方法即可,直接上代码:public class MyViewPager extends ViewPager { public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeS

2017-09-18 14:49:04 13526 2

原创 greenDao插入数据无效(多表关联)

直接说我的案例吧,学生选课,一个学生有多个课,也就是student中有一个List。因为是多对多的关系,所以建立了第三张表JoinCourseToStudent。 @Entitypublic class Student { @Id(autoincrement = true) Long sid; String name; @ToMany @Joi

2017-09-14 22:07:26 1398

原创 最简单完全退出应用方式(活动依次出栈)

实现思路非常简单,在Application中维护一个链表,活动创建时加入链表,销毁时同时删除列表中的元素。当需要完全退出时,将链表中的活动依次调用finish即可。1.Application中的链表List list(Application需要能够获得单例,这里用的是方法getApp):public void addActivity(Activity activity){

2017-09-12 19:26:49 333

原创 greenDao配置和增删改查

配置:1.在项目gradle中加入greenDao插件:dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0' }2.在APP的gradle顶部加入插件:app

2017-09-12 18:55:41 236

原创 greenDao使用中android.database.sqlite.SQLiteException: no such table

使用greenDao过程中,新建了一个数据类Person并标注@Entity,然后框架自动生成了PersonDao,我使用这个Dao类来对Person表进行操作,然后安装到手机上后报了这个错。报错信息说没有这个表,这让我非常郁闷,难道每次应用启动的时候框架不会自动检查所有数据表,把新建的数据类映射到数据库中吗?实践证明是不会的,只有应用第一次安装的时候才会在数据库中新建这些表,之后再在

2017-09-12 18:14:07 7888 3

原创 CCF计算机软件能力认证模拟试题参考答案(JAVA)(201703 1+2)

1.分蛋糕:小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。

2017-09-08 19:18:23 1602

原创 recyclerview底部加载方案

因为项目中多个列表都需要用到底部加载,所以我想了一个简单的底部加载方案。先分析一下整个底部加载过程吧,首先为recyclerview设置滑动监听,recyclerview滑动时判断是否到达底部,到达就调用加载更多的方法。另外,还要控制加载过程的同步。实现:1.创建了一个类用来管理整个底部加载过程:package sdu.edu.cn.utribe.bean;import

2017-09-07 12:34:47 667

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除