Ade-rui的博客

私信 关注
WuRuiF
码龄5年

一件简单的事情,重复的去做,反复的思考,不断的改进,会发生奇迹。

  • 259,759
    被访问量
  • 124
    原创文章
  • 28,092
    作者排名
  • 50
    粉丝数量
  • 于 2015-09-14 加入CSDN
获得成就
  • 获得77次点赞
  • 内容获得53次评论
  • 获得95次收藏
荣誉勋章
兴趣领域
  • #Android
    #数据结构#Java#面试
TA的专栏
  • Android自定义一套自己的图表库
    2篇
  • android
    24篇
  • java
    37篇
  • android-例子
    12篇
  • 自定义view
    4篇
  • android技巧
  • android 开发中常见问题
    13篇
  • jni基础--c语言
    19篇
  • jni基础--Android studio与NDK开发jni
    9篇
  • c++
  • 数据库与sql
  • 设计模式
    12篇
  • Android Studio与Gradle的爱恨情仇
    1篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

IntentService与HandlerThread的工作原理(个人笔记)

IntentService与HandlerThreadIntentService为什么需要IntentServiceIntentService如何实现HandlerThread是什么?总结IntentServiceIntentService是Service的一个子类,为Android开发者提供了一个方便的在工作线程中执行的Service。为什么需要IntentService1.Servic...
原创
170阅读
0评论
0点赞
发布博客于 1 年前

仿Keep自定义控件(个人记录)

文章目录效果第一种模式:CENTER_TO_RIGHT mode第二种模式:CENTER_TO_LEFT mode第三种模式:LEFT第四种模式:RIGHT代码片段联系方式 : 15910220851 邮箱:343191616@qq.com效果我为贵方实现了4种模式第一种模式:CENTER_TO_RIGHT mode第二种模式:CENTER_TO_LEFT mode第三种模式:LEF...
原创
5376阅读
2评论
1点赞
发布博客于 3 年前

Android Studio编写Gradle插件时遇到的坑 Unable to load class 'XXX.XXX'

文章目录前言为什么会产生问题?如何解决前言很久以前使用写了一款Gradle插件为项目使用,但是使用Intellij idea写的,然后最近在复习写gradle插件,就在Android Studo里面写了,本人用的是2.2.3的Android Studio 一直没有换3.0,因为公司的电脑配置太辣鸡了,换了更不好用,太卡了。但是按照网上的教程,折腾了一天也不成功,一直报找不到插件的实现类,但是最...
原创
6798阅读
2评论
2点赞
发布博客于 3 年前

Android自定义图表库(一):圆形进度图

导航效果预览自定义View第一步:确认View的大小自定义View第二步:绘制内容总结效果预览自定义View第一步:确认View的大小无论是自定义一个View还是ViewGroup我们必须得先为其制定在不同MeasureSpecMode下的大小,我这里就不讲解什么绘制源码了什么的,我们就直接实战。我们在onMeasure中需要调用setMeasuredDimension(width,he...
原创
1364阅读
3评论
0点赞
发布博客于 3 年前

markdown编辑器的使用

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...
转载
144阅读
0评论
0点赞
发布博客于 3 年前

Android自定义图表库:前言

文章目录前言饼状图玫瑰图进度圆形图柱状图折线图前言网上的图表库说多也多 说少也少,但是我个人感觉很大的缺点就是,一个图表的文档太少,使用复杂,我个人的项目中一直使用的最古老的那个开源图表库AChartEngine,但是问题及其多,而且使用及其不方便,按照网上的资料设置相关的属性,却总是得到想要的效果,图表显示的时候,也会有各种重叠的现象,当时想换一个其他的图表库,比如MPAndroidChar...
原创
228阅读
0评论
0点赞
发布博客于 3 年前

Android Handler消息机制中的诸多疑问

前言网上总是有很多阐述Android消息机制的文章,基本上大同小异,都是讲Handle,Message,Looper,MessageQueue这四个类会如何协同工作的。但是动脑筋的童鞋们可能总是会有如下的一些疑问,我翻阅了数多微博,很多年了,也没有看到相关比较完整的解释,所以这些天自己深刻阅读了一下源码,并且为自己解答了心中一直存在的疑惑,记录在此,希望也能帮助有同样疑问的小伙伴。文章目录前言...
原创
174阅读
1评论
0点赞
发布博客于 3 年前

android java.lang.NoSuchFieldError: R$id.xxx

第一种情况 参考自http://www.shangxueba.com/jingyan/1856083.html    将引用的自定义控件的xml文件中的最外层布局上面添加xmlns:sat=“http://schemas.Android.com/apk/res/控件所在位置的包名”可是在运行时就会报java.l...
转载
492阅读
0评论
0点赞
发布博客于 3 年前

一篇文章讲清楚Gradle与Gradle Wrapper的区别

Gradle:android用来构建项目的编程框架。这个玩意对于使用AS开发的,大家都清楚,用这个来构建项目变得无比轻松和高可定制性,比如引入第三方依赖,发布到maven库,构建多渠道版本等等都变得非常轻松,所以对于使用Gradle,自然是没有任何异议了,但是大家经常会在自己的项目中没有看见gradle,疑惑Gradle在哪?反而,没找到gradle,却总是能看见一个叫gradle wrapper...
原创
25583阅读
2评论
14点赞
发布博客于 3 年前

Android studio terminal终端命令行显示不全,只显示左边一半

Android Studio的Terminal一直问题很多,比如说,你写命令执行任务,和查看任务输出,只显示左边的少半屏幕,剩下的既不换行,也不显示,就这样被硬生生截断了。。真是无语比如:看了这篇文章后,找到了解决方法https://blog.csdn.net/divaid/article/details/79198077...
转载
1809阅读
0评论
0点赞
发布博客于 3 年前

Android关于buildToolVersion与CompileSdkVersion的区别

转载自 https://www.cnblogs.com/bluestorm/p/6849082.html如下在AS的android project下,外部库中的第一个android.jar的版本,也就是  compileSdkVersion Android关于buildToolVersion与CompileSdkVersion的区别 http://blog.csdn.net/mooreliu/ar...
转载
261阅读
0评论
0点赞
发布博客于 3 年前

Android调取拍照和获取拍照后的照片

需要调取照相机拍照,但是又不想用第三方,自己去写的时候,却发现有很多坑。比如:1、拍完照后,如何获取照片?2、照片获取不到是什么原因?@ContentView(R.layout.activity_main)public class MainActivity extends BaseActivity { Uri saveUri; @Override protecte...
原创
3662阅读
2评论
0点赞
发布博客于 3 年前

Android在部分手机上调用完相机之后,取不到uri 并且本activity的所有变量都为null的现象

一般情况下,我们大部分情况是通过传递uri的方式来调用系统相机的:Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);mTakePhotoUri = FileUtils.getOutputMediaFileUri(FileUtils.MEDIA_TYPE_IMAGE);intent.putExtra(Media
转载
346阅读
0评论
0点赞
发布博客于 3 年前

设计模式-访问者模式

定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。落实到代码就是: 有一个类族A(继承与同一抽象类或者父类),它们各自的实现类之间又有许多不同的操作,或者也得考虑增加新的操作,有一个族群B将要访问A中许多对象,并且对不同类型的对象进行的操作不同,那么我们为了避免代码耦合以及变动引起的代码污染,就通过定义一个访问接口,来访问族群A,
原创
332阅读
0评论
0点赞
发布博客于 4 年前

设计模式-原型模式

原型模式:通过拷贝原型实例,来创建一个新的此种类型的对象。简单点说就是,通过一个对象实例,创建一个“一摸一样” 的对象实例,但是与原对象是两个不同的对象实例。那一摸一样作何解释?因为拷贝又分为浅拷贝和深拷贝,而一摸一样只是所表现出的形式,而实质却有所不同。浅拷贝:对于非引用类型属性拷贝一副,对于引用类型属性指向原对象的地址。深拷贝: 引用类型属性也拷贝一份。我们
原创
304阅读
0评论
0点赞
发布博客于 4 年前

Android复习-事件分发机制(个人笔记)

一、Activity,Window,View我们在View里面接收到的MotionEvent是哪里来的?事件由系统先传递给Activity的dispatchTouchEvent方法,然后再通过window对象传递给decorView,decorView会最终传递给我们设置的布局里。如何向下传递?假设我们设置的顶级view是一个ViewGroup,那么事件会由Activity传递给D
原创
444阅读
0评论
0点赞
发布博客于 4 年前

Android复习-fragment声明周期与Activity生命周期(个人笔记)

Fragment生命周期(笔记):onAttach onCreateonCreateView:onViewCreatedonStartonReume:onPause:onStoponDestoryViewonDestoryonDetchfragment的生命周期与Activity绑定的,但是又不能统一而说,比如用fragmentManager
原创
859阅读
0评论
0点赞
发布博客于 4 年前

java再复习-常用线程池

ThreadPoolExecutor只是java对线程池最原始的实现,java还提供了不同特性的封装好的线程池来供我们使用。Executors工具类提供了一系列静态工厂方法来帮助我们创建不同特性的线程池。1、FixedThreadPool: Executor executor = Executors.newFixedThreadPool(3);这是一种线程数量固定的线程池,它的线程都
原创
322阅读
0评论
0点赞
发布博客于 4 年前

java再复习-线程池

线程池:涉及到池的概念,肯定是为了重复利用资源,避免资源的重复创建,以及方便统一管理,线程池也不例外,可以避免频繁的创建线程和销毁线程带来的性能消耗,也可以对线程的并发数以及行为等进行一个统一的管理。java中有一个Executor接口,它就是线程池的顶层接口,而真正的实现是ThreadPoolExecutor。ThreadPoolExecutor的使用:public clas
原创
303阅读
0评论
0点赞
发布博客于 4 年前

Android复习-intent-filter匹配规则

隐式启动Activity,需要为这个Activity提供一组intent-filter进行匹配,这种隐式启动的方式往往用于启动别的App的一个Activity组件:为一个Activity指定一组intent-filter:
原创
363阅读
0评论
0点赞
发布博客于 4 年前

Android复习-任务栈与Activity启动标记(使用标记启动Activity时的坑)

总结一下:这些标记单独使用,只有clearTop是起作用的,其余的不起作用。然后我就试了一下上面在service中组合使用的情况下,发现使用Service中的组合情况是有效果的,并且和Service中的效果是一样的。有人可能会说为什么在Service中就要使用组合呢,因为Service启动Activity必须得加上FLAG_ACTIVITY_NEW_TASK,所以实验的使用实验其他三种标志也必须与这个标记组合。所以,一般情况下不要依赖使用标记,这个产生的效果不是很好。请在配置文件中配置。
原创
715阅读
0评论
1点赞
发布博客于 4 年前

Android复习-Acitivity的启动模式

所谓启动模式就是配置文件中的这个属性: <activity android:name=".Main3Activity" android:launchMode="standard"> launchMode属性用来标识Activity的启动模式,不行的话默认为standard。一共有四种:在介绍这四种模式之前首先的明确一个任务栈的概念,
原创
246阅读
0评论
0点赞
发布博客于 4 年前

Android复习-Acitivity的生命周期(二、异常情况下的各种回调)

首先来明确一下何为异常情况:Acitivty被异常杀死,例如Activity在后台时由于内存不足或一键清理引起的杀死,或者Acitivty的配置发生变化时,例如横屏转为竖屏。这些情况都会导致Activity执行“死亡”流程,并且再执行创建流程。进入一个Activity:A...onCreateA...onStartA...onResume然后进行横屏:03-13 11
原创
348阅读
0评论
0点赞
发布博客于 4 年前

Android复习-Acitivity的生命周期(一、正常情况下的各种回调)

Activity七大生命周期总结(源自Android艺术开发与探索):onCreate:表示Activity正在被创建,这个时候需要做一些初始化工作,例如加载布局资源,初始化数据。onStart :表示Activity正在被启动,即将被启动,这时的Activity已经可见了,但是在后台,无法与我们进行交互,并且对于我们而言,是不可见的。onResume: 表示Activity已经可见,
原创
584阅读
0评论
0点赞
发布博客于 4 年前

java再复习-枚举的使用及其实现原理

java 枚举的使用以及枚举的实现原理,枚举的深入理解
原创
387阅读
0评论
1点赞
发布博客于 4 年前

java再复习-Future与Callable的使用

Future总是与Callable绑着使用的。callable接口:相当于Runnable,但是被线程执行后可以提供返回值。future接口:用来保存Callable的返回值的。所以他俩是结合使用的Future常用子类:FutureTask,一个保存Callable接口返回值的任务,使用:public class FutureAndCallableDemo { publ
原创
289阅读
0评论
0点赞
发布博客于 4 年前

java再复习-CyclicBarrier的使用

CyclicBarrier:译为路障,给它一个初始值(一般为线程的个数),然后这些线程分别去干自己的事,然后干完之后汇合,汇合完之后再去各种去干自己的事,看例子:public class CyclicBarrierDemo2 { /** * 第一个参数:需要等到几个(与CountDownLatch正好相反,countDounwLatch是需要消耗几个) * 第二个参数:当数值达到时
原创
225阅读
0评论
0点赞
发布博客于 4 年前

java再复习-Exchanger的使用

Exchanger:使用两个线程间交换数据,阻塞的等待。例子:public class ExchangerDemo2 { public static void main(String[] args) throws Exception { final Exchanger exchanger = new Exchanger<>(); new Thread(){ publ
原创
306阅读
0评论
0点赞
发布博客于 4 年前

java再复习-Semaphere的使用

Semaphere:翻译为信号灯,其实就是提供一个值,用来限制并发访问量的,如果大于他的这个值,则会阻塞,小于的话可以进行执行,看例子:public class SemaphoreDemo2 { /** * 建立信号灯类 * 第一个参数为:并发数 * 第二个参数为:是否公平,默认为false,也就是一个参数的构造函数时就默认为false, * 那么何为是否公平呢? 如果设置
原创
340阅读
0评论
0点赞
发布博客于 4 年前

java再复习-CountDownLatch的使用与实际应用(Android)

CountDownLatch相当于一个多线程的计数器,可以不用关注数的同步,来定义一个数值去等待做一些事情,看例子:public class CountDownDemo2 { /** * 初始化一个CountDownLatch,次数为3 */ public static CountDownLatch countDownLatch = new CountDownLatch(3);
原创
441阅读
0评论
0点赞
发布博客于 4 年前

java再复习-ThreadLocal的使用

JDK1.5以后提供了许多方便的关于线程的类,比如ThreadLocal,一个可以在线程范围内共享数据的类:使用:public class ThreadLocalDemo2 { public static ThreadLocal threadLocal = new ThreadLocal<>(); public static void main(String[] args) {
原创
235阅读
0评论
0点赞
发布博客于 4 年前

设计模式-状态模式

状态模式:当一个对象 的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。简单点说:一个对象的功能根据它内部状态而表现出不同的行为。举一个反例,用遥控器来举例,遥控器在电视开的情况下和电视没开的情况下,同样的按键会表现出不同的结果。普通的编程方式:public class TeleController { /** * 开机状态 */ public stati
原创
246阅读
0评论
0点赞
发布博客于 4 年前

设计模式-模板方法模式

模板方法:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使的子类可以不可以一个算法的结构即可重定该算法的某些特定步骤。简单点说:有一组流程要执行,流程中只有一个步骤是未知的,它前后的其余步骤都是固定的,我们就将这一步骤延迟到具体的子类去实现,以达到通用代码的抽象封装。假设有一个考试的父类:/** * 考试 * @author PC * */public abstrac
原创
176阅读
0评论
0点赞
发布博客于 4 年前

设计模式-外观模式

外观模式:提供一个统一的接口,用来访问子系统内部的一系列接口。其实简单点说:有一个复杂的系统,它有许多功能依赖与其他的子系统,让这个复杂的系统对外提供统一接口,对子系统的依赖与逻辑操作封装在内部去完成。就是简单的封装而已。举一个手机的例子,例子来源-Android源码设计模式实践与实战。定义系统顶层接口:/** * 手机 * @author PC * */public i
原创
167阅读
0评论
0点赞
发布博客于 4 年前

设计模式-适配器模式

适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。示例:定义目标接口(真正所期待的功能):/** * 电脑充电接口 * @author PC * */public interface ComputerPower { /** * 需要5V * @return */ int getPower(
原创
265阅读
0评论
0点赞
发布博客于 4 年前

设计模式-策略模式(结合JDK源码)

策略模式:定义了一系列算法族,并将每一个算法封装起来,而且使他们可以互相替换。策略模式让算法独立于使用它的客户而独立变化。问题:假设我们有一个类,提供为List排序功能,分别有选择使用快速排序,冒泡排序。我们常使用的最普通的实现方式:/** * 排序工具类 * @author PC * */public class SortUtil { /** * 快速排序 */
原创
568阅读
0评论
0点赞
发布博客于 4 年前

设计模式-观察者模式,以及如何使用观察者来为app实现即时通讯功能

观察者模式:定义对象间一种一对多的依赖关系。使的每当一个对象状态改变,则所有依赖它的对象都会得到通知。使用场景:微信公众号,即时通讯中的消息收发等等。现在用一个做即时通讯的用到最主要的一部分来举例,对于消息的接收。定义被观察者接口:/** * 消息被观察者 * @author PC * */public interface MessageReceiver { /**
原创
279阅读
0评论
0点赞
发布博客于 4 年前

设计模式-装饰者模式

装饰者模式定义:动态的为一个对象增加额外的功能。what?啥意思。。? 其实还是遵循那个原则,对修改关闭,对扩展开放。如果要给一个类增加额外的功能,不要去修改他的代码,而是通过其他类持有它的引用,在功能前后增加所要增加的功能即可。看程序设计,java的流体系就是用装饰者模式设计的,我们自己也来设计一套流。顶层接口:/** * 输入流顶层接口 * @author Ade-ru
原创
237阅读
0评论
0点赞
发布博客于 4 年前

设计模式-命令模式

命令模式:将一个请求或者命令封装成一个对象,从而让用户将客户端请求参数化。对请求排队,或者记录日志,以及支持撤销动作。每次看任何定义都是云里雾里╮(╯▽╰)╭。其实我觉得这个模式就是将要进行的请求封装成对象,为什么要封装成对象?因为这个请求可能不是一个动作能完成的,再者就是这个请求需要依赖与另外的功能类去实现,如果代码直接耦合的持有另一功能类的引用去操作实现功能,会使的代码耦合度比较高,而且不
原创
160阅读
0评论
0点赞
发布博客于 4 年前

java再复习——异常总结

异常体系:Throwable顶层接口:Error:错误体系,发生这种错误,代表发生了不可挽回的错误,JVM会直接停止运行,并不提供任何可处理机制,只打印相关错误信息。Exception:异常体系,发生这种异常,相当于生病,有的可处理,有的不可处理,但是都是只是“病”,没有致命的问题,可以解决。RuntimeException:作为Exception的子类,RuntimeExcept
原创
184阅读
0评论
0点赞
发布博客于 4 年前

java再复习——使用JDK1.5新特性优化生产者消费者

传统的生产者消费者代码有一个问题:就是在notifyAll的时候会唤醒锁池中所有等待的线程,包括消费者线程和生产者线程,但是我们只知道,我们生产完之后值想唤醒消费者线程,我们消费完之后只想唤醒生产者线程,这样唤醒无用线程,既增加多余的判断,又影响性能。java在JDK1.5以后就提供了比较好的工具,把wait,notify,notifyAll方法封装成了一个Condition对象,可供我们操作
原创
203阅读
0评论
0点赞
发布博客于 4 年前

java再复习——线程的经典问题-生产者消费者

为什么多线程总是离不开这个问题呢?因为这种场景是多线程在生成环境中最重要,最主要的应用,基于这种场景提炼出的问题就是生产者消费者问题。实例代码:/** * 资源 * @author PC * */class Resource { int count = 0; boolean isHas = false; public synchronized void produc
原创
287阅读
0评论
0点赞
发布博客于 4 年前

设计模式-工厂模式

工程模式是一个大家族,里面根据时间的推移和不断的优化,以及应用的场景,又分为不同的类别:一:静态工厂模式二:简单工厂模式三:工厂方法模式四:抽象工厂模式一一举例。静态工厂模式: 我们平常常用的静态工具类其实就是使用了静态工厂模式,类+静态方法,这种实现,例子:public class StaticFactoryDemo { public static boo
原创
251阅读
0评论
0点赞
发布博客于 4 年前

设计模式-单例模式

单例模式定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式的使用场景:一:避免产生多个对象而过度消耗资源,例如数据库连接池。二:这个对象有且仅应该只有一个对象,例如Android的Application实例。代码实现:第一种:饿汉式public class SingletonDemo { private static final
原创
194阅读
0评论
0点赞
发布博客于 4 年前

java再复习——线程的状态以及等待唤醒机制

线程有自己的状态,看下图:上图基本描述的线程的生命状态,有的地方也会将冻结状态分为两种,但这没多大意义,明白就好,上图的流程也有少画的,详细会解释。解释一下各种状态消亡状态:不用说,线程死了。创建状态:new Thread()就代表创建了一个线程运行状态:thread.start()之后就开始运行现场,不过有可用没有抢到CPU执行权,所以有可能在阻塞状态等待。冻
原创
229阅读
0评论
0点赞
发布博客于 4 年前

java再复习——线程的死锁问题

使用多线程的时候,除了因为操作共享数据带来的安全问题,还有一个就是因为,为了避免安全问题去使用同步,但是因为同步使用不当而产生的死锁问题。例子:public class DeadLockDemo { public static void main(String[] args) { Data data = new Data(); new Thread(new RunnableA(
原创
154阅读
0评论
0点赞
发布博客于 4 年前

java再复习——线程的安全问题以及同步

使用多线程,最重要的就是安全问题,何为安全问题?public class ThreadTest1 { public static void main(String[] args) { MyRunnable runnable = new MyRunnable(); new Thread(runnable).start(); new Thread(runnable).start()
原创
189阅读
0评论
0点赞
发布博客于 4 年前

java再复习——多线程之初识线程,并从源码角度分析start与run方法,Thread类与Runnable接口

进程与线程的概念。进程:是操作系统为一个程序分配内存空间的基本单位。线程:存在于一个进程里,是程序执行的基本单元。线程才是负责是去执行程序的。java创建线程的方式:一:继承Thread类,java为我们提供了封装好的线程类 Threadclass MyThread extends Thread{ @Override public void run() { Sy
原创
1889阅读
0评论
1点赞
发布博客于 4 年前

java再复习——Collections和Arrays

常见问题Collections和Collection的区别?Collection的集合底层接口,而Collections只是一个操作集合的工具类。Collections提供的常用有用方法:sort:排序max:取最大值binarySearch:二分查找toArray:将集合转换为数组,值得注意的是,转化的时候需要new一个数组传入,如果这个数组的长度小于集合的长度的话,方法
原创
270阅读
0评论
0点赞
发布博客于 4 年前

java再复习——Map体系

常有Map与Collection什么关系?没什么关系,都是集合的顶层接口,没有直接关系。Map体系没有实现Iterator接口。Map体系的特殊结果,K,V存在。 K键唯一。Map体系的常用实现类:HashMap: 底层实现哈希表,允许Key值和Value值为null,线程不同步的。TreeMap : 底层是二叉树,不允许key为null(因为TreeMap要排序,
原创
242阅读
0评论
0点赞
发布博客于 4 年前

java再复习——Collection体系

Collection体系作为开发中最常用的东西,值得再次梳理一下。体系图:Collection作为集合的顶层接口,它也有顶层接口,就是Iterable,为了描述所有集合必须有迭代器来进行遍历与取值的共性。Collection中最常用的两类实现接口为: List与Set.为什么分为两类?因为所存储数据时的数据结构不一样List: 这一类的容器,数据是有序的,并且可以重复,
原创
289阅读
0评论
0点赞
发布博客于 4 年前

java再复习——通过反射获取到方法的参数和返回值的泛型类型

我们都知道了可以定义带有泛型参数的方法,以及泛型返回值的方法了,那么泛型在运行的时候已经被擦除了,我们该如何知道这个泛型到底是什么呢?有很多情况需要知道实际泛型是什么,Android数据库框架以及Http框架在解析成json成实体类的时候,必然要知道是哪个类。获取参数的泛型API方法:public class GenericParameterizedTypeDemo { public
原创
15077阅读
0评论
3点赞
发布博客于 4 年前

java再复习——自定义泛型类

我们最先接触泛型是在哪里?我像大家都应该是这个:List list = new ArrayList();这样的话,这个链表就只能存放String类型的参数(不考虑通过反射绕过编译器存其他类型的参数这样的行为),以及取值等都是String。这就是一个泛型类,那么我们如何自定义我们的泛型类?(注意不要解决T能不能写出别的。比如说E了什么的。。确实是能写成E,不管是T,E都只是一个代替,
原创
828阅读
0评论
0点赞
发布博客于 4 年前

java再复习——自定义泛型方法

曾经对每一个新手都有这样的问题,做一个可以通用的给数组元素换位置的方法,那么这么做。。? 初学java阶段当然是方法的重载啊,但是其实还是写了好多代码。。。有时候就因为一个参数不一样,那么久得再重载一个,很痛苦的,看着其实也并不高大上,我们心里也一定知道,肯定会有其他高级方法的,这时候自定义泛型方法就出现了。自定义泛型方法的语法:public class GenericDemo2 {
原创
358阅读
0评论
0点赞
发布博客于 4 年前

java再复习——泛型的通配符与扩展

上次说了泛型的语法,发现有个问题,就是泛型是什么就得是什么,但这样岂不是程序就得写死了,没有一点可预判性了吗,那么泛型的好处也就光体现在不用进行强制类型转换上了吗?泛型还给我们提供了一种符号 : ?  这种符号代表通配符,意思是什么都可以,看例子 /** * 打印任意集合的值 * @param list */ public static void printSize(List
原创
271阅读
0评论
0点赞
发布博客于 4 年前

Android Studio打包错误Error:Error: Expected resource of type id [ResourceType]

AS打包经常会报这样的错误,特别是在使用SharedSDK时:E:\AndroidStudioProjects\ManagerClient\app\src\main\java\cn\sharesdk\onekeyshare\theme\classic\EditPage.javaError:Error: Expected resource of type id [ResourceType]
原创
2082阅读
0评论
0点赞
发布博客于 4 年前

java再复习——泛型使用语法上的一些坑

一些使用泛型过程中的语法的坑例如: //可以 List list = new ArrayList(); //原类型指向泛型参数类型OK List list2 = new ArrayList(); //泛型参数类型指向原类型也可以 List list3 = new ArrayList();这样写
原创
478阅读
0评论
0点赞
发布博客于 4 年前

java再复习——泛型

java在1.5之后引入泛型,为了什么?一:泛型只在编译时起作用,运行时会彻底擦除。二:因为泛型会在运行时被彻底擦除,所以不会影响程序的运行效率三:泛型的出现,使的程序中存在的类型不同的安全隐患问题可以得到很好的解决,而且也为程序免去了强制转换类型的多余步骤以及可能出现的运行时强制类型转换错误。例如: List list= new ArrayList();
原创
169阅读
0评论
0点赞
发布博客于 4 年前

java再复习——通过反射使用类的属性,方法和构造器

知道了如何获取到类的属性,方法和构造器,那么就应该开始使用了。public class ReflectDemo { public static void main(String[] args) throws Exception{ //加载类 Class clazz = Student.class; //取得无参构造函数 Constructor declaredConstru
原创
346阅读
0评论
0点赞
发布博客于 4 年前

java再复习——通过反射获取类的名字,属性,方法,构造器

熟练的使用反射的API,才可以熟练的写框架,不会语法,如何写句子?public class ReflectTest { public static void main(String[] args) throws Exception { //加载类 Class clazz = (Class) Class.forName("Student"); //获取类名 System.ou
原创
551阅读
0评论
0点赞
发布博客于 4 年前

java再复习——通过反射读取注解

通过反射读取类的注解与属性的注解的相关常用APIpublic class AnnoationTest { public static void main(String[] args) throws ClassNotFoundException { //通过反射加载类 Class clazzClass = (Class) Class.forName("Student"); //读
原创
778阅读
0评论
0点赞
发布博客于 4 年前

java再复习——成员内部类为什么不能定义静态变量

java的成员内部类不可以定义静态变量,为什么要设计? 以及真的完全不能静态的东西吗?public class InnerClassDemo { class InnerClass{ //1、这样是可以的,这样编译器会在编译的时候就将这种语句变成常量值(也就是说可以定义所有的static final + 基本数据类型) static final int i = 50; //2、这
原创
4983阅读
0评论
2点赞
发布博客于 4 年前

java再复习——注解的定义与使用

@Target(value = ElementType.FIELD)@Retention(value = RetentionPolicy.RUNTIME)public @interface Column { String name() ; boolean isId() default false;}这是声明一个注解,@Target与@Retention为元注解,用来对自定义注
原创
280阅读
0评论
0点赞
发布博客于 4 年前

java再复习——多态的理解

每当有人问我什么是多态的时候,我并不知道到底该如何去回答。我只知道在代码中什么时候该使用接口,什么时候使用父类,继承,使用多态的特性来编程,但是到底该如何回答,今天我想强迫自己总结一下。多态的定义:多种形态,可以实现动态联编,就是在编译的时候是一种形态,在运行的时候绝对它的真正形态。这话到底是他妈的什么意思?简单点,说话的方式再简单点,对应代码就是:public class Tes
原创
227阅读
0评论
0点赞
发布博客于 4 年前

java再复习——字符串他妈到底有几个?

类的内存分析,为什么要加载方法到方法区,以及如何生效等都记录过了,再记录一下,方法区中的字符串常量池。我们在定义一个字符串变量时,JVM会先去方法区的常量池中寻找是否有以及存在的,如果有就直接将引用指向常量池中的这个字符串,如果没有就先在常量池中创建一个字符串,然后将引用指向它。public class Test { public static void main(String[] ar
原创
206阅读
0评论
0点赞
发布博客于 4 年前

java再复习——this的真正意义以及方法区的方法信息与对象的方法是如何产生关联的

this关键字:指代当前调用某方法的实际对象this关键字最常用场景:public class Student { String name; public Student(String name) { this.name = name; } }在同名的情况下,用来区分是局部变量还是对象的全局变量,当然还有其他场景,比如this()调用本类的其他构造方法,或者其他
原创
931阅读
0评论
0点赞
发布博客于 4 年前

java再复习——代码执行的大体流程与内存分析

一段java代码是如何执行的以及它所涉及的内存分配时如何进行的?一:一个java程序的主入口为public static void man();二:java程序内存分为:堆内存和栈内存三:作为一个程序,代码的执行流程,一定是从左到右,从上到下的。程序片段:public class Test { int i; String name; public stati
原创
240阅读
0评论
0点赞
发布博客于 4 年前

java再复习——面向对象(二)

上一次记录了一下面向对象是如何而来的,以及为什么要用面向对象的思想来编程,在工作中会带来什么好处。这一次我想记录一下我个人对面向对象的理解。我觉得:面向对象编程,其实是面向对象组织代码为什么要这么说?  因为上一次虽然说了那么多面向过程写代码的坏处,以及面向对象写代码的好处,但是细心的人或者初学者就发现,代码到最后写下来,每一句最根本的代码还不是面向过程吗?  假如说上一次举得例子,得
原创
207阅读
0评论
0点赞
发布博客于 4 年前

java再复习——面向对象(一)

面向对象,OOP,全名Object Oriented Programming,本意就是以对象为导向的编程。OOP是如何演变而来的?要只知道面向对象的是如何演变而来的,必须得先知道,在它之前人们是如何编程的,也就是面向过程编程。早起的C语言就是典型的面向过程编程,计算机专业的学生一定都学过C语言,大家都知道C语言是如何编程的,特别是新手,定义大一堆变量,然后再写一大堆的方法(好的话,
原创
247阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(九)android如何监控到应用被卸载?

我们经常会有一些需求,当应用被卸载的时候,发起一个问卷调查,或者清楚推送标识,避免应用都被卸载了还能收到推送(我们公司的项目就这样。。当初可郁闷了)网上流行的答案: 注册一个receiver.....监听应用被卸载。 我对这个回答的看法与实践:纯属扯淡!难道就没人去验证一下。。?网上都抄来抄去的。。。应用都被卸载了,你的java代码都被清除了,你些的java代码还能起作用吗。?思路:开
原创
525阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(八)开辟C进程

这样慢慢的就体现出了jni的强大,它可以通过C做到许多java做不到的事情,比如开辟一个C进程,我们知道java进程随时都有可能被系统杀死,并且在java进程中开辟出的任何线程也会随之被杀死,所以有时候我们需要开辟一个独立于java进程的进程来做一些事情,这个时候就需要用jni来做到。java代码:public class MainActivity extends AppCompatAct
原创
1001阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(七)C调java静态方法代码

上次记录了一下如何调用java代码,但是java方法有静态与非静态之分,所以调用方式也是不一样的。java代码:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.
原创
783阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(六)C调java代码

java如何调用C代码,大概已经了解了,通过是先本地方法来调用。那么C代码如何代用java代码套路与思路:通过反射java代码:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) {
原创
2987阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(五)java调C,并且传递数组

java调用C代码,传递数组并且操作,是如何进行的?java代码:public class JNI { /** * 加载动态链接库 * 也就是c代码编译好的so文件 */ static { System.loadLibrary("app"); } public native int[] changeArrVa
原创
1715阅读
2评论
0点赞
发布博客于 4 年前

JNI基础(四)小程序,java调C,并且传递参数

java中的方法需要给c语言中的方法传参数,该怎么办呢。。?其实一样,直接写一就行了,然后将编译好的.h文件中对应的方法进行实现就可以了。java代码:public class JNI { /** * 加载动态链接库 * 也就是c代码编译好的so文件 */ static { System.loadLibrary("app"
原创
528阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(三)第一个小程序,java调C

配置好jni运行环境,就可以写程序了,记录一下第一个小程序,java native方法调用c方法,并且返回值:java代码:public class JNI { /** * 加载动态链接库 * 也就是c代码编译好的so文件 */ static { System.loadLibrary("app"); } pu
原创
317阅读
0评论
0点赞
发布博客于 4 年前

JNI基础(二)Android Studio 配置NDK

上一次随随便便的写了一些Android Studio如何配置NDK,但是其实也并不能对新手起到一定的指导作用,因为只是作为个人用来记录大概如何配置的笔记,但是经过我的大量实践发现,Android Studio配置NDK并运行起来第一个JNI程序,真是坑太多了,数不甚数,我用同样的方法,在家里面的电脑一次配置成功,并且运行很舒畅,但是在公司的电脑就出现了各种各样的问题,导致最后我把AS升级了最新的,
原创
353阅读
0评论
0点赞
发布博客于 4 年前

一天练习一个小C/C++程序(二) 指针到底该如何使用

以前写C基础的时候,写过很多次指针的例子,那到底指针在C项目中会怎么应用呢?通常有两方面:一:函数的传参:我们已经说过,函数传参除非传的是内存地址,要不修改后的值对传入之前的值没有影响。二:跨函数修改值: 其实我觉得这个和第一条一样。。都是为了使其在另一个函数的修改无论在哪都生效。三:定义数据结构。其实可以发现,需要直接操作内存的情况下,就需要使用指针,这样指针才有意义
原创
491阅读
0评论
1点赞
发布博客于 4 年前

一天练习一个小C/C++程序(一) 控制台版“金山打字”游戏

今天练习了一个C语言小程序,控制台版的简易“金山打字”小游戏。效果图:代码:#include#include#include#include void printfSpace(int num){ for(int i=0;i<num;i++){ printf(" "); }}void printfColumn(int num){ for(in
原创
5952阅读
3评论
3点赞
发布博客于 4 年前

Android软键盘(七)键盘显示的状态下,onKeyDown方法无法监听到back事件

Android键盘显示的状态下,onKeyDown方法无法监听到back事件,android弹出键盘的系统下,监听不到返回值的解决方案。
原创
2404阅读
0评论
0点赞
发布博客于 5 年前

Android软键盘(六)如何监听到软件盘显示与隐藏的事件

有时候我们需要监听软件盘隐藏事件。但是官方并没有提供相关的监听回调,这时我们就需要通过计算布局来判断软键盘的关闭事件了。思路与上一篇文章Android软键盘(五)如何判断软键盘是否显示相似。看效果图:有图有证据,不说了,上代码: @Override protected void onResume() { super.onResume();
原创
14952阅读
11评论
11点赞
发布博客于 5 年前

Android软键盘(五)如何判断软键盘是否显示

前几次分析了软键盘自动弹出的现象,以及布局上移上移等问题,这次记录一下,如何判断软键盘是否在显示。先来看一下网上比较流行的答案:一:if(getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE){ Toast.makeText(Main3
原创
31683阅读
9评论
17点赞
发布博客于 5 年前

JNI基础(一)Android Studio 配置NDK

Android Stduio配置NDK步骤:一:下载NDK工具包,网上很多,自行在下。二:解压工具包,获得ndk-bundle文件夹,一般会将此文件夹放入SDK的根目录下,方便寻找(放哪不影响使用,但路径不能有空格和中文)。三:配置NDK环境变量,在Path环境变量添加ndk-bundle路径。四:新建项目在local.properites文件中加入ndk-bundle的路
原创
428阅读
0评论
0点赞
发布博客于 5 年前

Android软键盘(四)软件盘弹出布局上移的问题(2)

第一种情况:界面没有导致软键盘会自动弹出的ListView或者ScrollView,这时候去点击EditText或者通过代码手动调出键盘,这种情景下导致的布局上移。解决方案:在相应Activity清单文件中加上这个属性:android:windowSoftInputMode="adjustResize|stateHidden"这种情况下,必须使用adjustResize,使用adjustPan不起作用。 为什么加上stateHidden ? 我已经在文章(二)中说过,如果不加上的话,虽然布局不会上
原创
6644阅读
1评论
1点赞
发布博客于 5 年前

Android软键盘(三)自动弹出键盘的现象

Android中有一个现象,就是进入一个包含EditText的页面便会自动弹出键盘,特别讨厌。但是其实大家有没有发现,并不是只要包含了EditText的页面就会自动弹出键盘的。往日在做开发的时候,如果遇到这样的问题就会直接用网上的解决方法去解决,也考虑不了那么多了,但是我相信大家一定也会发现,同样是包含了EditText的页面,但有时会自动弹出键盘,有时却不会,今天我认真测试了一下各种情况,总结一
原创
3403阅读
3评论
0点赞
发布博客于 5 年前

(十七)结构体指针

结构体指针,语法:#include struct Student{ int age; char sex;}; void main(){ //定义结构体 struct Student stu = {22,'W'}; //定义结构体指针变量 struct Student* stuP = &stu; //通过指针变量访问数据 printf("age = %d
",(
原创
342阅读
0评论
0点赞
发布博客于 5 年前

(十六)结构体

C语言的结构体,不知道咋解释......就是相当于JAVA的类这样一个存在吧。对一些共同属性的封装。语法:#include struct student{ int age; char sex;};void main(){ //声明一个结构体变量 struct student stu = {23,'M'}; printf("stu.age=%d
",stu.age
原创
194阅读
0评论
0点赞
发布博客于 5 年前

(十五)枚举

定义枚举与使用与java类似,不同的是C语言的枚举类型只能是在整型的,并且是递增连续的的。语法:#include enum WeekDay{ Monday,Tuesday ,Wednesday,Thursday,Friday,Saturday,Sunday}; void main(){ enum WeekDay _sunDay = Sunday; printf("%d",_
原创
183阅读
0评论
0点赞
发布博客于 5 年前

(十四)联合体

联合体的语法和特点:#include union body{ int x; long y; double dd;} ;void main(){ printf("union长度:%d",sizeof(union body)); } 运行结果: union长度:8可以看到,定义联合体与方法体差不多,不过没有返回值和参数列表。而且使用联合体的时候,也需要和u
原创
231阅读
0评论
0点赞
发布博客于 5 年前

(十三)函数指针

函数指针,顾名思义,用来指向函数的指针变量。语法:#include int add(int x , int y){ return x + y; } void cacul(int x,int y){ int caculResult = x - y; printf("caculResult=%d
",caculResult); return ;}void main(
原创
206阅读
0评论
0点赞
发布博客于 5 年前

(十二)C语言动态内存分配

上一次记录了一下所谓的静态内存分配,我们可以看出静态内存分配有很多问题,大部分情况下我们不希望自己所做的工作白费,也就是内存被回收,除了确定了没用,所以我们该如何做呢?  C语言提供了动态内存分配,就是自己手动申请内存,但是也需要手动去释放内存。语法:使用malloc(int)关键字类申请一块内存,参数为要申请内存的大小,单位为byte#include #includevoid s
原创
468阅读
0评论
0点赞
发布博客于 5 年前

(十一)C语言静态内存分配

C语言静态内存分配时什么意思?所谓静态内存分配,就是值我们并没有鲜明的指明内存分配,普通的变量的声明啦什么的,都需要内存,但是都是由系统自动分配的,所以叫静态内存分配。(暂时不考虑在哪一块内存区域分配)例如一段程序:#include void swipe(int** p){ int temp = 999; *p = &temp; }void main(){
原创
1490阅读
6评论
0点赞
发布博客于 5 年前

(十)指针的再次说明

指针在我的理解意义上,有2层含义。第一层:定义一个指针变量第二层:进行一次指针运算。定义一个指针变量:#include void main(){ int *iP; char *cP; float *fP; printf("int iP长度:%d
",sizeof(iP)); printf("char cP长度:%d
",sizeof(cP)); prin
原创
340阅读
0评论
0点赞
发布博客于 5 年前

(九)C语言数组的取值,取地址。

有最常见的根据索引取值,与java相同。以及最常见的通过&符号取地址的值。也有其他取地址的值得方式。值得注意的是,我们上边通过取出地址,直接通过 * 进行指针运算,便可以得到对应的值。这里可以看到,我们并没有声明声明指针变量,便可以使用*,这也验证了我所说的 * 的出现,除了在定义指针变量的时候,其他情况下是作为一个动词出现的,它的出现就代表着是一次指针运算。
原创
5404阅读
1评论
0点赞
发布博客于 5 年前

Android软键盘(二) 软键盘弹出布局上移的问题

Android软键盘弹出布局上移分析,以及相应的解决方案。
原创
10418阅读
0评论
3点赞
发布博客于 5 年前

Android软件盘(一)手动显示与隐藏

软件盘是个头疼的问题,一会乱弹出,一会不弹出,弹出之后还各种影响布局。所以我们今天来从头到尾来研究一下软件盘的使用。往往都是点击一个EditText自动弹出软件,再次点击则消失,那么我们如何主动来操作软件盘?效果图:代码如下:public class MainActivity extends AppCompatActivity implements View.OnC
原创
512阅读
0评论
0点赞
发布博客于 5 年前

RecyView刷新加载

封装RecyclerView+SwipeRefreshLayout ,下拉刷新,上拉加载例子。
rar
发布资源于 5 年前

(八)C语言数组

C语言数组定义,指针后移,数组的内存地址
原创
547阅读
0评论
2点赞
发布博客于 5 年前

(七)多级指针

JNI开发-C语言基础C语言多级指针的理解,要理解多级指针一定得先理解,指针并不只是一个名词的意思,它有一层指针运算的概念包含在里边。
原创
372阅读
0评论
0点赞
发布博客于 5 年前

(六)指针的应用---址传递(实则为地址的值传递)

C语言中的指针在应用中如何使用呢?下面是一个java中经典的例子用C语言的实现:#include swipe(int x,int y){ int temp = x; x = y; y = temp;} void main(){ int x = 3; int y = 4; printf("交换前: x=%d,y=%d
",x,y); swipe(x,y); pr
原创
282阅读
0评论
0点赞
发布博客于 5 年前