南栀倾寒   >   存档   >   2017 年 09 月 - 17 文章

在Android Studio中有六种依赖 有更新!

2017-09-05

在Android Studio中有六种依赖 Compile,Provided,APK,Test compile,Debug compile,Release compile Compile compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。 Provided Provided是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk。 APK 只会打包到apk文件中,而不参与编译,所以不能再代码中直接调用jar中的类或方法,否则在编译时会报错 Test compile Test compile 仅仅是针对单元测试代码的编译编译以及最终打包测试apk时有效,而对正常的debug或者release apk包不起作用。 Debug compile Debug compile 仅仅针对debug模式的编译和最终的debug apk打包。 Release compile Release compile 仅仅针对Release 模式的编译和最终的Release ….

多线程死锁的模拟 有更新!

2017-09-05

死锁的原因:  线程1锁住资源A等待资源B,线程2锁住资源B等待资源A,两个线程 都在等待自己需要的资源,而这些资源被另外的线程锁住,这些线 程你等我,我等你,谁也不愿意让出资源,这样死锁就产生了。  哲学家进餐问题  解决死锁的办法之一就是:加大锁的粒度。 public class DeadLock02 { // 绑匪:说:你给我500亿,我就放了你儿子,目的:得到了500亿 // 富翁:说:你先放了我儿子,,我就给你钱,目的:赎回儿子。 public static void main(String[] args) { MyThread02 mt1 = new MyThread02(); MyThread02 mt2 = new MyThread02(); mt1.flag = true; mt2.flag = false; new Thread(mt1).start(); new Thread(mt2).start(); } } class Kidnapper{ public void say(){ System.out.println(“你给我500亿,我就放了你儿子”);….

利用多线程进行文件的复制 有更新!

2017-09-05

class FileCopy implements Runnable { private File src;// 源文件 private File tar;// 目标文件 private int n;// 分几部分 private int no;// 每部分的编号 public FileCopy(File src, File tar, int n, int no) { this.src = src; this.tar = tar; this.n = n; this.no = no; } @Override public void run() { try { RandomAccessFile rafsrc = new RandomAccessFile(src, “r”); RandomAccessFile raftar = new RandomAccessFile(tar, “rw”); long len = src.length(); long size = len % n == 0 ? len / 4 : len / 4 + 1;// 每部分的字节数 byte[] b = new b….

(Apache)使用HttpClient方式访问HTTP 有更新!

2017-09-05

Apache使用GET方式访问HTTP 得到访问地址 HttpGet(有参数提供参数) 得到网络访问对象HttpClient,进行连接 得到返回值 如果返回值正常,返回得到的数据对象HttpEntity,得到数据流 注意: GET方式在URL中传递中文参数乱码问题我解决了。 乱码原因:不管客户端采用什么方式给中文字符编码,最终附加到URL中之前,都将在已有的编码基础上再对字符以ISO-8859-1字符集做二次编码然后再附加到URL中。 即所有的非ASCII字符集参数在URL中最终都是ISO-8859-1编码,如果之前已经进行了一次编码,那么这就是在已有编码的基础上二次编码 解码是编码的逆操作,只要在服务器端对客户端进行的编码再进行对应解码即可。过程如下: 1. 在客户端对中文字符串编码,比如使用UTF-8编码 String codeParam = URLEncoder.encode(“中文字符串”, “UTF-8”); 2. 把这个编码好的codeParam作为参数附加到URL地址中; 3. 服务器端getRequestParameter()方法获得该参数(当然这个参数作为URL提交时….

sd卡操作工具类 有更新!

2017-09-05

public class SDCardHelper { private static String TAG = “SDCardHelper”; /* * 判断sdcard是否挂载 / public static boolean isSDCardMounted() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } / * 获取sdcard绝对物理路径 / public static String getSDCardPath() { if (isSDCardMounted()) { return Environment.getExternalStorageDirectory().getAbsolutePath(); } else { return null; } } / * 获取sdcard的全部的空间大小。返回MB字节 */ public static long getSDCardSize() { if (isSDCardMounted()) { StatFs ….

SQliteDatabase相关操作的工具类 有更新!

2017-09-05
0 评论 1,263 浏览

(一)、MySQLiteDatabaseHelper类的封装: 1、public void getConnection(); /** @作用:执行带占位符的select语句,查询数据,返回Cursor @param sql @param selectionArgs @return Cursor / 2、public Cursor selectCursor(String sql, String[] selectionArgs); /* @作用:执行带占位符的select语句,返回结果集的个数 @param sql @param selectionArgs @return int / 3、public int selectCount(String sql, String[] selectionArgs); /* @作用:执行带占位符的update、insert、delete语句,更新数据库,返回true或false @param sql @param bindArgs @return boolean */ 4、public….

Android中的缓存处理及异步加载图片类的封装 有更新!

2017-09-05
0 评论 1,135 浏览

一、缓存介绍: (一)、Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一。 1、没有缓存的弊端: 流量开销:对于客户端——服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量。 加载速度:如果应用中图片加载速度很慢的话,那么用户体验会非常糟糕。 那么如何处理好图片资源的获取和管理呢?异步下载+本地缓存 2、缓存带来的好处: 服务器的压力大大减小; 客户端的响应速度大大变快(用户体验好); 客户端的数据加载出错情况大大较少,大大提高了应有的稳定性(用户体验好); 一定程度上可以支持离线浏览(或者说为离线浏览提供了技术支持)。 3、缓存管理的应用场景: 提供网络服务的应用; 数据更新不需要实时更新,即便是允许3-5分钟的延迟也建议采用缓存机制; 缓存的过期时间是可以接受的(不会因为缓存带来的好处,导致某些数据因为更新不及时而影响产品的形象等) 4、大位图导致内存开销大的原因是什么? 下载或加载的过程中容易导致阻塞; 大位图Bitmap对象是png格式的图….

Bitmap二次采样 有更新!

2017-09-05
0 评论 1,155 浏览

二次采样: (一)、意义或目的: 1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.decodeFile(imageFile); 2、BitmapFactory.Options.inSampleSize:设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。 3、BitmapFactory.Options提供了另一个成员inJustDecodeBounds。设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。 例如: BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = 4; Bitmap bitmap = BitmapFactory.de….

书签选项卡的分类实现步骤 有更新!

2017-09-05

TabActivity实现选项卡效果的步骤:【了解】 1、写选型卡页面特殊的布局文件: 根节点必须是TabHost,属性android:id=“@android:id/tabhost” 是固定值; 必须有子节点TabWidget,必须有属性android:id=“@android:id/tabs”; 必须有一个布局节点,属性必须是android:id=“@android:id/tabcontent”。 2、继承TabActivity:(以前学习的过程中都是继承android.app.Activity类,但是这里需要继承android.app.TabActivity) 3、创建TabHost对象:通过getTabHost()方法来实现。 4、分别创建TabSpec对象: 通过TabHost对象的newTabSpec()方法创建TabSpec对象; 通过setIndicator()设置标签和图标; 通过setContent()设置内容。 5、TabHost对象添加TabSpec对象。通过TabHost对象的addTab()方法实现添加选项卡。 FragmentActivity 实现选项….

利用Volley对图片的加载 有更新!

2017-09-05

Volley一些介绍就不多说了,利用Volley加载图片主要有3种方式(1)ImageRequest(2)ImageLoader(3)NetWorkImageView 这里我们主要运用的是ImageLoader ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。 Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。 ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。 主Activity中的代码 package com.hht.android_….

PHP Curl工具类 有更新!

2017-09-05

class Util_CurlUtil { /** * @param $url * @return mixed / public static function curlGet($url) { // 1. 初始化 $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. 执行并获取HTML文档内容 $output = curl_exec($ch); if ($output === FALSE) { echo “CURL Error:” . curl_error($ch); } // 4. 释放curl句柄 curl_close($ch); return $output; } /* * @param $url * @param $postData * @return mixed */ public static functi….

PHP合并2个数字键数组的值并去重 有更新!

2017-09-05

/** * PHP合并2个数字键数组的值并去重 * @param array $arr1 * @param array $arr2 * @return array * @author hehaitao01 */ function new_array_merge($arr1, $arr2) { if (!is_array($arr1) && !is_array($arr2)) { return array(); } if(!isarray($arr1)){ return $arr2; } if(!is_array($arr2)){ return $arr1; } $arr = array_flip($arr1) + array_flip($arr2); return array_keys($arr); }

Eclipse转Android Studio

2017-09-05
0 评论 1,554 浏览

第一步:将Eclipse的上Ant编译的项目导出 1)右击项目进行export选择 Gradle模式导出 如下图: 注意在导出完成后又一个提示: 在导入Studio的时候要选择生成的build.gradle导入而不是选择整个项目导入(不然会导入失败) 第二步:向Studio导入转化完成的项目 1)在Ant转化成Gradle完成后剩下的就是导入Studio了(在导入Studio的时要挂上代理,因为Studio要下载Gradle,并且编译一下你的项目),这地方一般会是你的项目的Gradle版本过低,现在最好是使用Gradle 1.0+的版本 2)在Gradle下完后你发现项目还是报错(不报错就不正常了),最常见的就是你的图片资源很多在Studio下是报错的,编不过的,一个是你的.9图片格式不对,一个可能是你原先的项目里将jpg格式的图片强转成png,这个Studio会有严格的检查,对于其他不是很重要的图片问题你可以在Gradle里配置 aaptOptions { cruncherEnabled = false useNewCruncher = false } 这个来关闭它的….

Elasticsearch相关操作梳理

2017-09-05

  1. 创建新表 curl -XPUT ‘host:port/table_name?pretty’ table_name:表名,不能有大写字母,不能以下划线开头 pretty:使返回结果以便于阅读的JSON格式返回 自定义 schema,即mapping两种方式: 1.在创建表的时候一块创建: host:port/table_name { “settings”: { “number_of_shards”:4, “number_of_replicas”:1 }, “mappings”: { “dishlist”: { “_all”: { “enabled”:false }, “properties”: { “id”: { “type”:“string”, “index”:“not_analyzed” }, “dish_name”: { “type”:“string”, “index”:“not_analyzed” }, “dish_name_analyzed”: { “type”:“string”, “index”:“analyzed”, “analyzer”:“ik_max_word” ….

Android Wear开发浅析 置顶! 有更新!

2017-09-05
0 评论 1,623 浏览

Android Wear究竟是什么? Android Wear和手机是完全不同的设计理念:手机大多数情况下,都是用户去操作,去触发里面的应用;而手表则是“用户被动”的,用户越少感觉到你的存在,越是合理,而在某些场景下给予最合适的提醒,则是Android Wear最伟大的设计理念,这也是它想做到的。 Android Wear是智能的通知栏!(个人理解) 在早上醒来的时候,给你推送早上的天气、交通状况。在你到达餐馆的时候,给你推送大众点评,美团购物券,为你精打细算。检测到你的运动状态,显示计步器,心率状况(Android Wear本身内置)。 Android Wear开发阶段 产品需求方向的确定 很重要的是,产品要设计成什么样子? 手机到手表的信息通知栏样式优化 : 例如设置背景 手机与手表的智能推送:例如通过手表来寻找手机,或是将手机拍到的照片发送给手表 自定义卡片样式:保持卡片样式的基础上,对卡片内的布局进行调整,添加动画,点击等交互 完全自定义界面,提供独特的交互:可抛弃卡片样式,使用WearAPI提供的新组件 手表表盘:各种样式,各种高大上 技术实现 ….

滑动隐藏标题栏 有更新!

2017-09-05

在项目开发中,我们常常遇到一些类似需求,比如列表滑动的时候头部的标题在隐藏和显示两种模式切换,实现方法各种各样,但大体思路就是监听滑动控件的触摸事件 这里我们拿ListView做个例子,实现步骤大体分这么几步: 1. 为ListVie添加监听手势 2. 当用户向上滑动是隐藏标题栏 3. 当用户向下滑动时显示标题栏 第一步:为ListVIew添加手势监听 mListView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mFirstY = event.getY(); break; case MotionEvent.ACTION_MOVE: mCurrentY = event.getY(); if (mCurrentY - mFirstY > mTouchSlop) { // 下滑 显示titl….

Hadoop fs 命令使用手册

2017-09-05
0 评论 2,206 浏览

HDFS(Hadoop Distributed Filesystem)提供一个类似于Unix Shell的命令接口FSShell,用于client和HDFS进行数据交互。 调用FSShell命令的方式: $HADOOP_HOME/bin/hadoop fs 其中,$ HAOOP_HOME指hadoop所在的目录。所有的的FS shell命令使用URI路径作为参数。URI格式是scheme://path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。其中scheme是可选的,未加指定就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/child(假设你配置文件中的默认值是namenode:namenodeport)。命令的出错信息会输出到stderr,其他信息输出到stdout。 命令详细介绍 下面是对常用命令的详细介绍(本文档只适用于Hadoop-v2版本,其他版本的命令使用及返回值存在差异….