- 博客(112)
- 资源 (26)
- 收藏
- 关注
原创 Java并发系列之volatile
讲到Java并发,多线程编程,一定避免不了对关键字volatile的了解,那么如何来认识volatile,从哪些方面来了解它会比较合适呢?个人认为,既然是多线程编程,那我们在平常的学习中,工作中,大部分都接触到的就是线程安全的概念。而线程安全就会涉及到共享变量的概念,所以首先,我们得弄清楚共享变量是什么,且处理器和内存间的数据交互机制是如何导致共享变量变得不安全。共享变量能够在...
2018-05-31 00:11:49
478
原创 Java并发系列之Synchronized
每一个刚接触多线程并发编程的同学,当被问到,如果多个线程同时访问一段代码,发生并发的时候,应该怎么处理?我相信闪现在脑海中的第一个解决方案就是用synchronized,用锁,让这段代码同一时间只能被一个线程执行。 我们也知道,synchronized关键字可以用在方法上,也可以用在代码块上,如果要使用synchronized,我们一般就会如下使用:public synchroniz...
2018-05-31 00:09:30
6687
原创 好记性不如烂笔头(三)
SwiftHTTP发送Http请求刚学 iOS,利用SwiftHTTP来发送Http请求,就遇到一个坑,还是得记一下,以便以后回顾及查找: func postWithSwiftHTTP() { let url = "http://ip:port/api" let params = ["param" : paramTextField.text!]
2016-01-05 18:53:13
1017
原创 iOS开发学习笔记(零)
创建firstapp项目,在Xcode上可见到以下的项目结构。项目结构firstapp AppDelegate.swiftViewController.swiftMain.storyboardAssets.xcassetsLaunchScreen.storyboardinfo.plistProducts firstapp.app描述说明简单地描述一下各个文件的作用:AppDel
2016-01-05 12:23:41
1069
原创 Git Tag 的使用
Git 提供了一个叫 tag的东西,即标签。作用每一次commit都会生成一串字符ID,如下所示: commit 7f2de2b2560e5d0623d64ef56f2128ed4ab532e0这在正常的开发流程中没有什么问题,也不会去关心,但是等我们要发布的时候,或者已经发布了几个版本之后,要找回之前发布的版本到底是在哪个提交呢?记住这串id吗? No way! 标签 (tag) 的作用就在
2015-12-31 10:27:21
1627
原创 关于一个App的架构思考
对于一个App来说,不管大小,我们在开发的过程中或多或少,都会碰到下面罗列的各种模块,需要我们去处理。业务处理,对用户输入的校验和展现判断等统计处理,对当前App或者对业务的数据统计等UI效果,包括主题配置,按钮,输入框,动画效果,自定义控件等更新升级,当前App的检查更新等服务器通信,与服务器通信获取数据,心跳连接等数据解析,比如对json,对xml等的解析等分享处理,分享到微信朋友
2015-12-23 12:34:39
1688
原创 RecycleView的基本使用方法
为什么要使用RecycleView,而不再使用ListView记得每一次在用ListView的时候,在Adapter中,总是需要我们自己去创建一个ViewHolder,去存储ListItem的布局,这么做的原因在于findViewById()是一个很耗时间的操作,所以我们需要一个静态的对象将layout过的控件给保存起来,下一次刷新这个item的时候,就不再需要调用findViewById去View
2015-12-22 18:28:37
5676
原创 好记性不如烂笔头(二)
获取手机wifi信息 /** * 获取Wifi的Mac地址 * @param context * @return */ public static String getWifiBssid(Context context) { WifiManager wifi = (WifiManager) context.getSystemServ
2015-03-21 17:19:27
1636
原创 对于Canvas和Bitmap的一点认识
在Android关于Canvas的API描述中,一开始就如下描述: To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.
2015-03-14 14:47:11
3274
3
原创 好记性不如烂笔头(一)
获取系统设置状态 我们可以通过Settings.System类来获取到一些系统设置的状态,所以我们可以通过以下代码来获取系统的状态,比如ACCELEROMETER_ROTATION 等,不过有一点要注意的就是,Android的ROM太多了,不同的厂商可能会直接改掉Android的实现,然后自己实现一套,然后,就崩了。 所以在真正处理的时候,我们需要去捕获异常,保证代码的健壮性。/*** 获取
2015-03-14 10:39:37
1453
原创 好记性不如烂笔头(零)
俗话说,好记性不如烂笔头! 在平常的开发工作中,很多时候我们都会用到一些代码量比较小,但是却很有用的功能,但是,都只是写过就算,下一次再想起来用的时候,已经不知道该去哪儿找了。 常常因为这些小点而浪费时间,也随着年纪渐长,智商有限,还是靠记下来,以备不时之需呀。获取圆形图片 /** * bitmap 要进行剪裁的位图 * size 剪裁的圆形图片的大小 */ p
2015-03-03 15:25:40
1306
原创 利用自定义View实现头像截取页面
那么,如何制作这样一个效果呢,关键点在哪里呢?做法其实可以有多种,1)可以直接继承ImageView,然后在ImageView的OnDraw函数中直接绘制圆形或者方形的高亮圈;2)也可以直接继承View,自己将Bitmap给传进来,在onDraw函数中先绘制图片,接着利用Path来绘制这个圆形或者方形的选择区域,利用Region.OP.DIFFERENCE来反向获取蒙板层。不过利用clipPath来实现这个蒙板层的绘制,画出来的圆形会有锯齿,这个目前我还没有找到比较好的办法去掉这个锯齿,不知道有没有
2015-02-28 18:28:50
1690
原创 Android学习小Demo(23)Aidl实现进程间通信
我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用。理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧。今天,我们就一步一步地利用我们所了解地关于AIDL的知识,并且实现我们自己的小Demo。
2015-01-18 15:56:14
3034
原创 跟面试官讲Binder(二)之关于AIDL的认识
面试官开口说:“听你刚才所说,在Android系统中,都是利用Binder来进行进程间通信的,那我怎么听说,还有利用AIDL来实现进程间通信的呢?”。其实,AIDL只是一种描述性语言,其全称是Android Interface Definition Language,即接口定义语言,利用ADT,我们可将自定义的AIDL文件转化成Java代码,而这些代码就能够来进行进程间通信(IPC)。为什么这些代码就能够进行IPC呢?那是因为,这些代码就是定义了Binder机制中作为服务端的Binder对象和客户端中用的
2015-01-06 00:14:27
5207
1
原创 Android学习小Demo(22)带删除按钮的TextView
我们创建了一个ClearableTextView,继承于TextView,关键的代码如下:1)设置CompoundDrawables。2)必须重载onTouchEvent方法。这是因为在TextView中设置四边的图标时,并没有提供其对应的点击事件,所以这就需要我们自己去拦截用户的点击事件,判断用户的点击区。。。3)定义一个接口,用来由外部实现,可在图标点击事件时触发处理,如下:4)为了让文字不存在的时候,删除按钮不出现,我们可以自己定义一个setTextClearable方法,里面包装了Text
2014-11-29 14:19:43
4684
原创 跟面试官讲Binder(一)
1)Server启动了,他要创建一个Binder实体,它的句柄是0,比如BpBinder(0),当设置了BINDER_SET_CONTEXT_MGR,驱动收到这个命令,它就知道是要将当前进程设置为ServiceManager,于是它就会当前这个Binder实体创建一个Binder节点(BinderNode),它在这里记录了 0 -> ServiceManager这样的mapping。2)另一个Server启动了,它也会创建一个Binder实体,名字叫 XXXManagerService吧,但是它的句柄就不
2014-11-26 17:16:00
4606
9
原创 关于ThreadLocal的一些认识
可以看到,其是从current这个线程里去获取Values对象的,而如果不存在这个对象,其就会调用initializeValues方法,为线程的localValues创建一个新的Values对象。最近再调用values的put方法,以当前ThreadLocal对象为key值,将我们的valule给存放到这个Values对象中,我们会马上意识到,Values实现的应该是一个类似Map的键值对的数据结构。从这里,我们就可以意识到:1)在每个线程中都存在一个Values对象。2)无论我们在哪个线程中调用T
2014-11-07 15:44:19
1566
1
原创 Android中利用Handler实现消息的分发机制(三)
说到代码的可读性,有时候,我们更加看重代码之间的层次或者说模块化,耦合度等特点。不同的业务逻辑,不同的功能,应该实现在不同的模块中,而模块与模块之间就可以通过一个消息来通信,而这种消息通讯方式,我们就可以利用Handler和HandlerThread来实现。比如,最近做的一个浏览器的小Demo,其类图如下:...在不同的模块实现中, 我们可以调用registerHandler方法,将其对象的Handler注册到MessageDispatcher中,然后通过sendMessage方法,指定对应的目标,
2014-10-28 17:55:31
2230
原创 Android中利用Handler实现消息的分发机制(二)
在这篇文章开始前,我们先总结一下前两篇文章中关于Handler, Looper和MessageQueue等的一些关键点:0)在线程中创建Handler之前,必须先调用Looper.prepare(), 创建一个线程局部变量Looper,然后调用Looper.loop() 进入轮循。1)当Handler创建之后,就可以调用Handler的sendMessageAtTime方法发送消息,而实际上是调用MessageQueue的enqueueMessage方法,将对应的消息放入消息队列。2)每一个线程都只有
2014-10-28 11:31:34
2082
原创 Android中利用Handler实现消息的分发机制(一)
这两个的差别就在于是否有参数Looper,而Looper是一个线程相关的对象。何谓线程相关的变量?就是线程间不能共享的对象,只在本线程内有作用的对象。那么Looper对象的作用是什么?从我个人的理解,Looper类就是对MessageQueue的封装,它主要做的是两件事:1)构造Looper对象,初始化MessageQueue,我们可以从其构造函数看到:可以看到,Loop对象被创建之后,会被放到ThreadLocal变量中,而ThreadLocal正是线程局部变量,这说明了关于Looper的一个特
2014-10-27 16:55:54
3063
原创 Android中利用Handler实现消息的分发机制(零)
在之前一篇介绍AsyncTask的文章中,我们在最后讲到,AsyncTask是利用Handler的消息异步处理机制,将操作结果,利用Message传回主线程,从而进行UI线程的更新的。而在我们日常的开发工作中,Handler也是我们经常使用的类之一,那么Handler的主要作用是什么?Handler 的主要作用就是对消息(消息可以是我们想做的一些UI更新,也可以是其他的一些不可见的操作,如操作数据库等)的异步处理机制,而相信大家都了解异步的概念。简单地说一下:1)从程序的角度来看,就是当执行某行代码
2014-10-27 15:42:35
2286
原创 关于数字证书和数字签名的一些认识
字签名,其实就是拿我们的私钥对想要签名的内容进行加密的过程。为什么数字签名能够在互联网中发挥作用呢?这是基于其两个特性。1)防篡改比如小明现在用自己的私钥将内容加密之后(签名),然后传给小红,小红可以用小明的公钥进行解密,从而看到内容。而在这个过程中,虽然其他人也有可能拿到小明的公钥去解密数据,然后看到数据的内容,但是其没有办法将数据修改之后,再重新加密,然后送给小红,因为没有小明的私钥。所以小明签名过的内容传给小红,就一定还是那些内容,没法篡改。2)防抵赖第二个问题就是,你一旦签了名,你就不
2014-09-22 12:25:39
4833
原创 关于字符集的学习笔记
大家知道,在计算机中,数据都是以二进制的形式来表示的,只有 0 跟 1。而我们在电脑屏幕上看到的能够被我们所理解的这些都是字符,不管是中文也好,英文也好,它们被存储到计算机内部的时候,都会被转换成二进制。那用什么样的二进制来显示什么样的字符呢,这就是由人们来决定了,这就是所谓的编码。也正因为此,出现了各种各样的编码方式,比如ASCII,UNICODE,还有和我们汉字相关的GB2312和GBK等。
2014-08-14 10:11:48
1830
1
原创 Android与WebView的插件管理机制
上一篇文章说到,当利用WebViewClient或者WebChromeClient来处理由html页面传过来的请求的时候,都会将对应的服务名称,操作方法和对应的参数数据传给一个叫PluginManager的类。PluginManager类的作用是什么?大家知道,当利用Android原生环境的功能,比如照像机,比如相册等,这些功能都是很分散的,说不清楚什么时候是需要这些功能,什么时候是不需要这些功能的,所以我们希望能够像插件一样,需要的时候就加载进来,不需要的时候不去理他,而PluginManager类就
2014-08-05 13:10:10
5187
原创 Android与WebView的同步和异步访问机制
WebChromeClient和WebViewClient是WebView应用中的两个最重要的类。通过这两个类,WebView能够捕获到Html页面中url的加载,javascript的执行等的所有操作,从而能够在Android的原生环境中对这些来自网页上的事件进行判断,解析,然后将对应的处理结果返回给html网页。这两个类是html页面和Android原生环境交互的基础,所有通过html页面来跟后台交互的操作,都在这两个类里面实现,在后面我们还会详细说明。2.4)mWebView.addJavasc
2014-08-04 13:25:04
12604
原创 跟面试官讲Binder(零)
通过上面的简单描述,我们可以这样认为,每一个提供服务的Server都会通过Binder驱动,将自身给注册到ServiceManager中,方便众多想获取服务的Client可以去ServiceManager找到自己。那么,这些Service都会经过内核空间的Binder驱动,其实这个"经过"的说法,本质上,就是Server们会将自身作为一个对象,封装在数据包中,将这些数据复制到内核空间中,由Binder驱动访问。而Binder驱动读取数据包的时候,如果发现其中有Binder实体,类似ServiceMana
2014-07-27 14:34:45
5068
5
原创 Android学习小Demo(21)ListView的联动选择
在日常的App开发中,尤其是在开发生活服务的应用上,很多时候,我们会需要联动地展现省市区的数据等,需求大概如下:1)展现所有省份2)当点击某省份的时候,在二级菜单上展现此省份下面所属的城市列表3)选中返回,显示我们选中的城市4)当重新进入选择页面的时候,标识出我们上一次选中(或者说当前已民选择)的值
2014-07-18 00:01:37
6324
1
原创 Android系统的启动过程
当我们拿到一台Android的智能手机,从打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的?系统上电当给Android系统上电,CPU复位之后,程序指针会指向启动地址,从该地址读取启动程序的可执行代码直接运行,或者将可执行代码与数据载入CPU内置的RAM中再运行。这一段代码,放在PC中,叫做BIOS,而在android等嵌入式系统中就叫做Bootloader。Bootloader引导程序通过Bootloader引导程序,可以初始化硬件设备,建立内存空间映射图,为操作系统内核
2014-07-12 22:03:24
2047
原创 由Git的SSH公钥到非对称加密
那么SSH公钥到底是什么,为什么要添加SSH公钥呢,怎么生成SSH公钥呢?希望能通过这一篇文章,将我理解的学习到的知识跟大家分享一下。公钥私钥,是非对称加密中的概念,是相对于对称加密而言的。所谓加密,就是将人人都能看懂的内容变成了莫名奇妙的内容,但是你跟我能够去解读它,而其他人则不行。这就等于给内容加上了一把锁。
2014-07-06 17:04:12
2625
原创 Git 工作流程
在项目组中使用Git的工作流程,有个专业的名称叫Git Flow。一般会使用以下五个分支来进行项目开发:1)master分支 2)develop分支 3)release分支 4)hotfix分支 5)feature分支不同的分支对应着不同的版本内容,掌握这个Git工作流程,相信能够帮助大家更好在项目组中使用Git,也有利于项目源代码质量的把控。
2014-06-26 23:33:12
1731
原创 Git 远程仓库
Git使用远程仓库的操作讲解:1)克隆远程仓库2)添加远程仓库3)从远程仓库抓取数据4)远程仓库本地改名5)删除远程仓库在本地的配置6)远程分支7)推送到远程仓库8)删除远程分支9)查看仓库信息
2014-06-20 00:18:00
1859
原创 Git 分支管理
当我们利用git init初始化一个目录的时候,这个时候是没有任何分支的,因为还没有任何文件纳入Git管理流程呢。linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace$ git initInitialized empty Git repository in /cygdrive/f/test_workspace/.git/li
2014-06-19 08:32:45
1663
原创 Git 基本用法
Git有一个好处,在本地的每一个项目都是一个完整的仓库,除了需要从网络拉取和推送到网络之外,其他所有的操作都可以在本地完成。本文简单地介绍如何在本地使用Git来对文件进行管理,下一篇文章再来说一下分支的管理。根据文件在 Git中 的状态,可将其内部分为三个工作区域:1)工作目录 如果拿 Git 来管理项目的源代码,那工作目录就是一个Workspace。其中的源代码文件可根据其是否纳入Git的管理流程分为三类: 1.1)Untracked:未纳入Git管理流程的 1.2)
2014-06-17 14:37:23
1408
原创 Android学习小Demo(20)关于Fragment的应用
Android在3.0之后引入了Fragment的概念,我猜测其想法可能只是想更好地兼容大屏幕或者平板的开发,因为大屏幕可以展示更多的内容,而内容一多,逻辑有可能就乱,而利用Fragment,则可以将不同的逻辑封装进不同的Fragment中,但是展现呢,还是在同一个Activity中,在同一个屏幕上显示。而对于屏幕并不大的手机来说,如果一个页面展示的东西并不多,那么其实将逻辑直接写在Activit
2014-06-05 17:52:49
2267
原创 Android中关于JNI 的学习(六)JNI中注册方法的实现
在前面的例子中,我们会发现,当在Java类中定义一个方法的时候,如下:public class ParamTransferTest { public static int testval = 1; public native void changeTestVal();则在对应的JNI层中,由javah生成的头文件和其对应的C文件,其方法名称必须如下:JNIEXPORT voi
2014-06-03 18:07:41
2142
1
原创 Android中关于JNI 的学习(五)在C文件中使用LogCat
Log是开发过程中,对于我们调试程序非常重要的一个工具,有很多时候,我们正是通过Log才能够看清楚程序是不是真的按照我们想像中的模式在跑,从而定位到问题所在的地方。而在Android开发中,毫无疑问,要是没有了logcat,我们调试程序的时候,就会痛苦死。在NDK的开发中,尽管我们是利用C/C++来开发程序的,然后通过加载共享库的方法来调用C/C++程序,Android也提供了一套方法,可以让
2014-06-03 10:09:56
2332
1
原创 Android中关于JNI 的学习(四)简单的例子,温故而知新
在第零篇文章简单地介绍了JNI编程的模式之后,后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我到底说的清楚没有,但相信很多童鞋跟我一样,在刚开始学习一个东西的时候,入门最好的方式就是一个现成的例子来参考,慢慢研究,再学习概念,再回过来研究代码,加深印象,从而开始慢慢掌握。今天我们就再来做一个小Demo,这个例子会比前面稍微复杂一点,但是如果阅读过前面几篇文章的话,理解起来也还是很简单的。很多东西就是这样,未知的时候很可怕,理解了就很简单了。1)我们首先定义一个Java类,里面包
2014-05-22 13:37:36
2355
原创 Android中关于JNI 的学习(三)在JNI层访问Java端对象
前面两篇文章简单介绍了JNI层跟Java层的一些对应关系,包括方法名,数据类型和方法名称等,相信在理论层面,能够很好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,由于表达能力或者理解还是有限,有些地方讲得不是很清楚,如果各位朋友有觉得云里雾里,欢迎大家有留言一起学习。概念上的理解有助于我们更好地认识JNI,而一些实际点的例子则能够更好地帮我们从代码上去掌握并应用JNI。...这是一种最简单的情况,但更多时候,我们需要在JNI层获得Java对象,对其进行操
2014-05-20 13:30:46
2100
原创 Android中关于JNI 的学习(二)对于JNI方法名,数据类型和方法签名的一些认识
我们可以看到方法名是以Java_com_lms_jni等开头的,还有什么所谓的Signature,那这些其实都是什么意思呢,今天我们就来简单地认识一下。JNI 命名规则对于传统的JNI编程来说,JNI方法跟Java类方法的名称之间有一定的对应关系,要遵循一定的命名规则,如下:1) 前缀: Java_2) 类的全限定名,用下划线进行分隔(_):com_lms_jni_JniTest3) 方法名:getTestString
2014-05-19 13:43:18
3252
Android联动ListView
2014-07-17
关于Fragment Demo的源代码
2014-06-05
Fragment和ViewPager使用Demo源代码
2014-04-09
导入已有数据的sqlitedb demo源代码
2014-03-31
Content Observer Demo 源代码
2014-03-11
volley demo 源代码 1
2014-03-10
SqliteDemo源代码
2014-02-12
NineoldAndroids jar 包
2014-01-26
Android 音乐播放器源码
2014-01-18
ApiDemoStudy
2014-01-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人