月度归档: 2021 年 5 月

编译型语言和解释型语言的区别?

编译型语言和解释型语言的区别?

订阅专栏
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:

1.编译
2.解释

由此高级语言也分为编译型语言和解释型语言。

主要区别在于,前者源程序编译后即可在该平台运行,后者是在运行期间才编译。所以前者运行速度快,后者跨平台性好。

编译型语言
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。

特点
在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。

总结

1.一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高;

2.与特定平台相关,一般无法移植到其他平台;

3.现有的C、C++、Objective等都属于编译型语言。

解释型语言
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。

特点

解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。

总结

1.解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低;

2.只要平台提供相应的解释器,就可以运行源代码,所以可以方便源程序移植;

编译型与解释型,两者各有利弊
前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。

PATH环境变量解释与设置

PATH环境变量解释与设置

1.PATH环境变量的涵义

PATH环境变量存储的是路径,当我们在命令行下输入一个命令如ls时,linux就会PATH表示的路径中查找,路径之间用;隔开

例如


ls在/bin目录下,而/bin存在PATH环境变量中。因此在任意位置执行ls,linux都能正确执行

2.设置环境变量

export命令用于设置或者显示环境变量。所以,设置PATH环境变量的代码为

export PATH=新的路径:$PATH
$PATH表示环境变量PATH

但这种方法是暂时的,重启注销之后就失效了,永久性的方法有两种
*种方法:

在用户主目录下有一个 .bashrc 文件,可以在此文件中加入 PATH 的设置如下:

export PATH=”$PATH:/your path1/:/your path2/…..”

注意:每一个 path 之间要用 “:“ 分隔。

注销重启 就可以了,也可输入 source etc/profile,动态加载。

第二种方法:

在 /etc/profile中增加。

export PATH=”$PATH:/home/zhengb66/bin”

输入source etc/profile,动态加载。

Python包管理工具pip的安装和使用

Python包管理工具pip的安装和使用

订阅专栏
本文讲述的核心库:pip

pip是python的一个非常好用的包管理工具,可以用来很方便地安装和管理各种三方库,本文对其基本用法进行介绍。

安装pip
Windows系统上安装
python 2.7.9及以上版本的windows版的安装包已经集成了pip,所以到python.org网站下载python-2.7.9.amd64.msi安装包并安装。
安装时选择”安装pip”。
安装好后添加python.exe和pip.exe文件所在路径到系统环境变量中。这两个路径分别为(假设我的python安装在了D:\Programs\Python27目录下):
D:\Programs\Python27
D:\Programs\Python27\Scripts
1
2
测试:打开cmd,输入:pip install web.py
进入python命令行,输入:import web,若导入成功则说明pip安装成功。
Linux系统上安装
到pypi.python.org上搜索pip,下载*新版本的源码压缩包。
在本地解压源码压缩包,进入源码路径,执行:python setup.py install即可安装。
测试:打开cmd,输入:pip install web.py
进入python命令行,输入:import web,若导入成功则说明pip安装成功。
注:ubuntu系统可以直接使用该命令安装:sudo apt-get install python-pip
pip常用命令
安装软件包:pip install 包名
注:这里的包名,也可以是已经下载好的whl文件或tar.gz压缩包文件路径,或者包所在的URL地址。
升级pip自身:pip install –upgrade pip
查看已经通过pip安装的包:pip list
显示当前已经通过pip安装的包及版本号:pip freeze,显示结果示例:
certifi==2017.7.27.1
chardet==3.0.4
idna==2.5
requests==2.18.2
urllib3==1.22
virtualenv==15.1.0
web.py==0.38

将pip freeze命令的结果重定向到requirements.txt文件中:pip freeze > requirements.txt
使用已有的requirements.txt文件在另一个环境上安装各种包(比如在一台新电脑上):pip install -r requirements.txt
注:这个命令的好处就是,如果换了一个新的环境需要安装一个相同的python环境,那么只需要有requirements.txt文件即可快速安装,就不需要再思考要安装哪些包了。
查看某个已经安装的包的详情:pip show 包名
查看过期的包:pip list –outdated
安装包到用户目录:pip install 包名 –user
安装本地的安装包:pip install 目录|文件名
卸载包:pip uninstall 包名
升级包:pip install 包名 –upgrade
显示包所在目录:pip show -f 包名
搜索包:pip search 关键字
查询可升级的包:pip list -o
下载包但不安装:pip install 包名 -d 目录
打包:pip wheel 包名
pip镜像源的设置与使用
国内pip镜像

豆瓣:http://pypi.douban.com/simple
中科大:http://pypi.mirros.ustc.edu.cn/simple
注:使用国内的镜像源,安装各种包速度会快一些。

指定单次安装源

pip install 包名 -i 镜像url

指定全局安装源

pip配置文件:

Unix、Mac OS的pip配置文件位于:$HOME/.pip/pip.conf
Windows的pip配置文件位于:%HOME%\pip\pip.ini
注:Windows下%HOME%路径一般为:C:\Users<UserName>\
往pip配置文件写入如下内容(如果没有配置文件则在相应路径新建一个),这里以豆瓣的镜像为例:

[global]
trusted-host=pypi.douban.com
timeout=6000
index-url=http://pypi.douban.com/simple

一个经验:如果在指定国内的镜像源后,安装某些库速度还是比较慢,那么可以直接在浏览器打开镜像源网站地址(比如:http://pypi.douban.com/simple),在浏览器中直接搜索并下载所需的库,然后使用命令pip install <文件名>进行安装。如果搜索不到需要的库,还可以去这里碰碰运气:http://www.lfd.uci.edu/~gohlke/pythonlibs/,这是加利福尼亚大学尔湾分校一个生物医学研究中心的网站,上面有非常非常丰富的已经打包好的各种Python库的whl文件,堪称”Python轮子博物馆”。

基础语法

基础语法

 

Python零基础学习
从零开始,教你语法、实战案例,快速搭建属于自己的python学习路线!
Python学长
¥9.90
订阅专栏
编码
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码:

# -*- coding: cp-1252 -*-
1
上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语言为保加利亚语、白罗斯语、马其顿语、俄语、塞尔维亚语。

标识符
*个字符必须是字母表中字母或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感。
在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。

python保留字
保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:

>>> import keyword
>>> keyword.kwlist
[‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]

注释
Python中单行注释以 # 开头,实例如下:

#!/usr/bin/python3

# *个注释
print (“Hello, Python!”) # 第二个注释

执行以上代码,输出结果为:

Hello, Python!

多行注释可以用多个 # 号,还有 ‘’’ 和 “””:

#!/usr/bin/python3

# *个注释
# 第二个注释

”’
第三注释
第四注释
”’

“””
第五注释
第六注释
“””
print (“Hello, Python!”)

执行以上代码,输出结果为:

Hello, Python!

行与缩进
python*具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下:

if True:
print (“True”)
else:
print (“False”)

以下代码*后一行语句缩进数的空格数不一致,会导致运行错误:

if True:
print (“Answer”)
print (“True”)
else:
print (“Answer”)
print (“False”) # 缩进不一致,会导致运行错误

以上程序由于缩进不一致,执行后会出现类似以下错误:

File “test.py”, line 6
print (“False”) # 缩进不一致,会导致运行错误
^
IndentationError: unindent does not match any outer indentation level

多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠()来实现多行语句,例如:

total = item_one + \
item_two + \
item_three

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:

total = [‘item_one’, ‘item_two’, ‘item_three’,
‘item_four’, ‘item_five’]

数字(Number)类型
python中数字有四种类型:整数、布尔型、浮点数和复数。

int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
bool (布尔), 如 True。
float (浮点数), 如 1.23、3E-2
complex (复数), 如 1 + 2j、 1.1 + 2.2j
字符串(String)
python中单引号和双引号使用完全相同。
使用三引号(’’’或”””)可以指定一个多行字符串。
转义符 ‘’
反斜杠可以用来转义,使用r可以让反斜杠不发生转义。。 如 r”this is a line with \n” 则\n会显示,并不是换行。
按字面意义级联字符串,如”this ” “is ” “string”会被自动转换为this is string。
字符串可以用 + 运算符连接在一起,用 * 运算符重复。
Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
Python中的字符串不能改变。
Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
字符串的截取的语法格式如下:变量[头下标:尾下标:步长]
word = ‘字符串’
sentence = “这是一个句子。”
paragraph = “””这是一个段落,
可以由多行组成”””

#!/usr/bin/python3

str=’Runoob’

print(str) # 输出字符串
print(str[0:-1]) # 输出*个到倒数第二个的所有字符
print(str[0]) # 输出字符串*个字符
print(str[2:5]) # 输出从第三个开始到第五个的字符
print(str[2:]) # 输出从第三个开始后的所有字符
print(str * 2) # 输出字符串两次
print(str + ‘你好’) # 连接字符串

print(‘——————————‘)

print(‘hello\nrunoob’) # 使用反斜杠(\)+n转义特殊字符
print(r’hello\nrunoob’) # 在字符串前面添加一个 r,表示原始字符串,不会发生转义

这里的 r 指 raw,即 raw string。
输出结果为:

Runoob
Runoo
R
noo
noob
RunoobRunoob
Runoob你好
——————————
hello
runoob
hello\nrunoob

空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
**记住:**空行也是程序代码的一部分。

等待用户输入
执行下面的程序在按回车键后就会等待用户输入:

#!/usr/bin/python3

input(“\n\n按下 enter 键后退出。”)

以上代码中 ,”\n\n”在结果输出前会输出两个新的空行。一旦用户按下enter 键时,程序将退出。

同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号(;)分割,以下是一个简单的实例:

#!/usr/bin/python3

import sys; x = ‘runoob’; sys.stdout.write(x + ‘\n’)

使用脚本执行以上代码,输出结果为:

runoob
1
使用交互式命令行执行,输出结果为:

>>> import sys; x = ‘runoob’; sys.stdout.write(x + ‘\n’)
runoob

此处的 7 表示字符数。

多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。

如下实例:

if expression :
suite
elif expression :
suite
else :
suite

Print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=””:

#!/usr/bin/python3

x=”a”
y=”b”
# 换行输出
print( x )
print( y )

print(‘———‘)
# 不换行输出
print( x, end=” ” )
print( y, end=” ” )
print()

以上实例执行结果为:

a
b
———
a b

import 与 from…import
在 python 用 import 或者 from…import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *

导入 sys 模块
import sys
print(‘================Python import mode==========================’)
print (‘命令行参数为:’)
for i in sys.argv:
print (i)
print (‘\n python 路径为’,sys.path)

导入 sys 模块的 argv,path 成员
from sys import argv,path # 导入特定的成员

print(‘================python from import===================================’)
print(‘path:’,path) # 因为已经导入path成员,所以此处引用时不需要加sys.path

命令行参数
很多程序可以执行一些操作来查看一些基本信息,Python可以使用-h参数查看各参数帮助信息:

$ python -h
usage: python [option] … [-c cmd | -m mod | file | -] [arg] …
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d : debug output from parser (also PYTHONDEBUG=x)
-E : ignore environment variables (such as PYTHONPATH)
-h : print this help message and exit

[ etc. ]

我们在使用脚本形式执行 Python 时,可以接收命令行输入的参数

Python变量和常量

Python变量和常量

 

Python零基础学习
从零开始,教你语法、实战案例,快速搭建属于自己的python学习路线!
Python学长
¥9.90
订阅专栏
变量:定义世间万物变化的状态
height 180
weight 140
age 18
tree_name yuyang

print(180)

height = 180
print(‘height:’, height)
weight = 140
print(‘weight:’, weight)
age = 18
print(‘age:’, age)
tree_name = ‘yuyang’
print(‘tree_name:’, tree_name)

变量的组成(符合变量名组成就不错)
变量名(描述;接收变量值) 赋值符号(赋值,把变量值传给变量名) 变量值(具体的值)

变量名的规范
akljfdksl = 10
print(‘akljfdksl:’, akljfdksl)

变量名必须要有描述意义
变量名由数字/字母/下划线组成,且不能以数字开头
$ = 10
print($)
10tree = 10
print(10tree)

不能以关键字命名
[‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’,
‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’,
‘print’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]

定义变量的两种方式(代码至上而下运行,如果相同的变量名,执行后面的)
下划线一般用来连接单词

name_of_nick = ‘nick’ # 下划线式(建议,必须)

NameOfJason = ‘jason’ # 驼峰体

print(name_of_nick) # 先定义才能使用,没有引号的就是变量名

常量:不变化的量(变量名全大写)
age = 1
age = age + 1
print(age)

常量:不变化是约定俗成的
AGE = 1

AGE = AGE + 1

常量:约定俗称的不变化,实际能变化,但是当你强行变化的时候,你第二天就滚蛋了

python内存管理
变量是python解释器提供的概念,运行python的时候才有
定义变量并运行 开辟一块新的内存空间存储变量

引用计数(针对变量值):变量值的引用次数

# age = 1000 # 1000的引用计数为1
# age1 = age # 1000的引用计数为2
# del age # delete删除age,1000的引用计数为1
# print(age1)
# del age1 # 1000的引用计数为0

**垃圾回收机制:**当一个变量值的引用计数为0的时候,会触发垃圾回收机制,改变量值会被回收

# # id
# age = 1000
# print(age) # 打印值
# print(id(age)) # 1507487488变量值的内存地址
# # 小整数池
# age1 = age
# print(id(age1))

当python启动的时候,会自动定义[-5,256]之间的整数变量,他们的内存空间已经写死了

# age = 10
# age1 = age
# del age
# del age1

按理来说因该触发垃圾回收机制,但是由于10属于小整数池,不会触发垃圾回收机制
面试的时候可能会问你,这个才能考到你的水平 —》 gil全局解释器锁

变量名用来接收变量值
定义变量就要开辟新的内存空间

# pycharm自行做了优化(短频快),pycharm把小整数池范围扩大了
# 打印值
print(age)

# 打印内存地址
print(id(age))

# 打印数据类型()
print(type(age))

Android 项目中用得*多*火的第三方框架可能都在这里了!

平时总会发现一些大家都比较推崇的第三方框架,觉得非常不错暂时又用不到,于是就打算把它们都收藏起来,需要用到的时候就不用到处问到处搜了。收藏得多了,本着热爱分享拥抱开源的思想,于是贴出来给大家分享交流。如有纰漏,敬请拍砖指正。

欢迎众收藏爱好者补充或指正!

 

分类 二级分类 框架名称 简介 Star 数 *近
更新
UI 刷新 SmartRefreshLayout 智能下拉刷新框架 11k 1天
UI 刷新 Android-PullToRefresh 比较早的一款下拉刷新框架 8.6k 5年
UI 刷新 android-Ultra-Pull-To-Refresh 下拉刷新框架 9.0k 2年
UI 刷新 BeautifulRefreshLayout 众多优秀的下拉刷新汇总 2.0k 2年
UI 图表 MPAndroidChart 统计图表库 21k 1天
UI 图表 hellocharts-android 统计图表库 5.7k 1月
UI 图表 smartTable 自动生成表格框架 1.7k 23天
UI 图表 AdaptiveTableLayout 可阅读与编辑CSV文件的库 1.4k 8月
UI 图表 TableView 绘制表格 1.5k 4天
UI 菜单 SlidingMenu 比较早的一款侧滑菜单 10k 4年
UI 菜单 MaterialDrawer 侧滑菜单 9.1k 1月
UI 菜单 SwipeBackLayout 类似QQ侧滑菜单 5.0k 8天
UI 图片 PhotoView 大图展示 12k 3月
UI 图片 subsampling-scale-image-view 大图展示 4.0k 1月
UI 图片 CircleImageView 圆形图片 9.6k 1月
UI 图片 uCrop 图片剪裁 7.0k 24天
UI 图片 android-gif-drawable Gif 加载 6.0k 3天
UI 图片 Matisse 图片\视频选择库 6.7k 1天
UI 文本 richeditor-android 富文本编辑器 3.7k 1年
UI 弹窗 material-dialogs 可定制化的 Dialog API 13k 12天
UI 弹窗 Toasty 定制不一样的 Toast 4.1k 11天
UI 弹窗 DialogUtil Dialog 工具 0.7k 15天
UI 弹窗 android-adDialog 广告弹窗 2.3k 1年
UI 导航 ViewPagerIndicator ViewPager 指示器 9.7k 5年
UI 导航 BottomBar 底部导航栏 7.7k 4月
UI 导航 FlycoTabLayout TabLayout 库 6.3k 1年
UI 布局 flexbox-layout Android 弹性 / 流式布局 11k 1月
UI 布局 AndroidAutoLayout 屏幕适配布局 6.0k 10月
UI 布局 FlowLayout 流式布局 3.6k 1月
UI 布局 vlayout 整套布局方案和组件复用 7.8k 23天
UI 滑动删除 AndroidSwipeLayout 滑动删除 9.9k 9月
UI 滚动 Android-ObservableScrollView 监听可滚动 View 的滚动事件 8.7k 2年
UI 列表 UltimateRecyclerView 功能强大的 RecyclerView 6.5k 1月
UI 选择器 Android-PickerView 仿 iOS 的选择控件 7.1k 19天
UI 选择器 AndroidPicker 安卓选择器类库 3.5k 3月
UI 下拉菜单 DropDownMenu 多条件筛选菜单 2.7k 1年
UI 轮播图 banner 广告图片轮播控件 5.8k 4月
UI 轮播图 Android-ConvenientBanner 通用的广告栏控件 3.5k 5天
UI WebView AgentWeb 高度封装的 WebView 3.6k 14天
UI 高斯模糊 500px-android-blur 高斯模糊控件 2.2k 1年
UI 高斯模糊 BlurKit-Android 高斯模糊控件 2.3k 1年
UI 角标 android-viewbadger 角标 / 徽章 2.9k 5年
UI 角标 BGABadgeView-Android 徽章控件 1.9k 24天
UI 其他 AndroidSlidingUpPanel 上拉面板 7.5k 7月
UI 其他 AppIntro 欢迎页 7.6k 1月
UI 其他 Android-Bootstrap UI框架 6.6k 9月
UI 其他 emojicon 表情文本 3.2k 9月
UI 其他 RippleEffect 水波纹效果 4.6k 2年
UI 其他 InfiniteCycleViewPager ViewPager 4.7k 8月
UI 其他 LoadingDrawable 酷炫的加载动画 3.2k 1年
UI 其他 QMUI_Android 提高 UI 开发效率的 UI 库 4.7k 5天
网络 框架 retrofit 网络框架 27k 16天
网络 框架 okhttp 网络框架 26k 6天
网络 框架 volley 网络框架 1.5k 9天
网络 文件下载 FileDownloader 文件下载引擎 6.5k 13天
网络 进度监听 ProgressManager okhttp 上传下载进度监听 1.5k 5天
图片 框架 glide 图片框架 21k 8天
图片 框架 Android-Universal-Image-Loader 图片框架 16k 2年
图片 框架 picasso 图片框架 15k 14天
图片 框架 fresco 图片框架 14k 6天
图片 压缩 Luban *接近朋友圈的图片压缩算法 7.4k 9天
图片 滤镜 android-gpuimage 图像滤镜框架 4.8k 2年
图片 转换 glide-transformations Glide 图像转换器 6.0k 11天
图片 选择器 Matisse 图片视频选择器 6.7k 1天
图片 选择器 TakePhoto 图片选择 / 剪裁 / 压缩 4.8k 1月
图片 选择器 PhotoPicker 仿微信图片选择器 2.5k 4月
图片 文字识别 tess-two Android 图片文字识别 2.5k 13天
视频 播放器 JieCaoVideoPlayer 节操视频播放器 6.6k 6天
视频 播放器 ijkplayer Bilibili 开源播放器 18k 2月
视频 播放器 GSYVideoPlayer 多功能视频播放器 5.7k 8天
动画 AE lottie-android 展示 AE 工具所作动画的框架 20k 13天
动画 转场 Material-Animations 安卓转场动画演示 11k 3月
动画 View AndroidViewAnimations 安卓视图动画合集 9.3k 9月
动画 多种 animate 多种动画效果 2.8k 2年
动画 列表 recyclerview-animators RecyclerView 条目动画 7.8k 2月
动画 列表 spruce-android 列表视图展现动画 2.6k 3月
动画 粒子 Grav 粒子动画效果 2.2k 1年
动画 爆炸 ExplosionField 爆裂动画效果 3.1k 2年
动画 兼容 Transitions-Everywhere Transitions API 的兼容补丁 3.7k 2月
异步 链式 RxAndroid Android 中的 RxJava 绑定 15k 2月
异步 链式 RxJava 事件驱动的基于异步数据流的编程模式 32k 2天
异步 链式 agera 谷歌开发的安卓链式编程框架 7.0k 2月
数据库 轻量级 realm-java 轻量级数据库 9.4k 3天
数据库 轻量级 greenDAO 轻量级数据库 9.8k 16天
文件 选择器 Android-FilePicker 图片 / 文件选择器 1.4k 19天
json 解析 gson 谷歌官方 Json 库 12k 2天
json 解析 fastjson 阿里巴巴 Json 库 13k 1天
字体 框架 Calligraphy 自定义字体库 7.6k 11月
语言 汉字处理 HanLP 中文分词 、关键词提取等 6.8k 2天
性能 卡顿 AndroidPerformanceMonitor 非侵入式性能监控组件 4.0k 8月
性能 卡顿 BlockCanaryEx UI 卡顿检测 1.7k 8月
性能 卡顿 AndroidDevMetrics 性能检测 1.3k 2月
性能 内存 leakcanary 检查内存泄漏工具 19k 8天
性能 生命周期 RxLifecycle 使用 RxJava 管理生命周期 5.5k 2月
性能 缓存 DiskLruCache 硬盘缓存工具 4.3k 1年
性能 UI框架 litho 高性能安卓 UI 的构建框架 4.8k 1天
热修复 框架 tinker 微信热修复框架 11k 24天
热修复 框架 dexposed 阿里热修复框架 3.8k 2年
插件化 框架 DroidPlugin 360 插件化框架 5.6k 7月
插件化 框架 dynamic-load-apk Apk动态加载框架 5.2k 10月
插件化 框架 atlas 阿里插件化框架 5.9k 5月
插件化 框架 Small 插件化框架 4.1k 9天
工具 工具类 AndroidUtilCode 安卓开发者不得不收集的代码 17k 1天
工具 工具类 android-common 不只是工具类的公共库 4.6k 1年
工具 工具类 android-common 通用 / 辅助 / 工具类的集合 2.9k 11月
工具 工具类 Lazy 常用工具类整理 1.6k 7月
工具 列表 BaseRecyclerViewAdapterHelper RecyclerAdapter 框架 13k 21天
工具 列表 baseAdapter Android 万能的 Adapter 3.7k 1年
工具 列表 FanLayoutManager 风扇扇叶旋转效果列表 1.7k 8月
工具 列表 CarouselLayoutManager 传送带效果列表 1.5k 1年
工具 列表 ChipsLayoutManager 流式布局列表 2.2k 1年
工具 状态栏 StatusBarUtil 设置状态栏的工具库 5.2k 7天
工具 状态栏 SystemBarTint 状态栏着色工具 4.8k 3年
通信 事件 EventBus Android 事件总线 18k 4月
键盘 表情 XhsEmoticonsKeyboard 表情键盘解决方案 2.3k 1年
键盘 冲突 JKeyboardPanelSwitch 解决键盘面板冲突 2.7k 3月
扫描 二维码 zxing 二维码扫描 18k 9天
注解 框架 androidannotations 快速开发框架 10k 5月
注解 绑定 butterknife 为 Android View 设计的绑定注解 20k 17天
注解 注入 dagger2 Android 依赖注入框架 10k 1天
权限 请求 PermissionsDispatcher 基于注解处理权限请求 7.1k 4天
权限 请求 RxPermissions 基于 RxJava 处理权限请求 6.1k 3月
响应式 UI RxBinding 安卓 UI 响应式编程 7.3k 27天
响应式 事件 otto 事件总线框架 5.0k 9天
hybrid 框架 JsBridge Android 与 JavaScript 互调桥梁 4.7k 4月
hybrid 框架 VasSonic 轻量级高性能的 hybrid 框架 7.7k 12天
崩溃 报告 acra 崩溃信息收集框架 4.3k 1天
崩溃 处理 CustomActivityOnCrash 崩溃处理 2.3k 5月
崩溃 预防 NullAway 检测 NullPointerExceptions 2.0k 3天
框架 MVP mosby MVP 框架 4.4k 9天
框架 多主题 MagicaSakura Android 多主题框架 2.6k 9天
架构 Clean Android-CleanArchitecture 一种清晰的 Android 架构 11k 2月
架构 Fragment Fragmentation 多 Fragment 架构的解决方案 6.3k 1月
构建 工具 buck 快速构建工具 5.7k 1天
编译 工具 freeline 秒级编译方案 4.5k 4月
混淆 工具 AndResGuard Android 资源混淆工具 4.6k 1月
测试 单元测试 robolectric Android 单元测试框架 3.9k 1天
测试 单元测试 mockito Android 单元测试框架 6.6k 5天
测试 单元测试 truth 谷歌的断言和命题框架 1.4k 4天
调试 框架 stetho Android 开发调试神器 9.5k 2月
调试 日志 logger 简单实用漂亮的日志打印框架 9.0k 23天
调试 数据库 Android-Debug-Database 调试手机中数据库 4.0k 2月
调试 方法 hugo 方法调试工具 5.9k 2年
反编译 工具 Apktool 反编译 APK 工具 6.1k 7天
Demo Rxjava RxJava-Android-Samples 学习 Android 中 Rxjava 6.4k 9月
反编译 工具 android-classyshark APK 分析利器 4.7k 17天
Demo Dagger u2020 Dagger 高级教学示例 APP 5.4k 5月
Demo MVP androidmvp Android 端 MVP 设计 APP 5.1k 2月
Demo 框架 android-architecture-components Architecture Component 官方演示 7.8k 6天
Demo 测试 android-testing 集成四大自动化测试框架的 Demo 5.3k 14天
Demo 设计模式 java-design-patterns java设计模式指南(英文 32k 4天
APP 仿造 bilibili-android-client 高仿哔哩哔哩动画安卓客户端 3.4k 9月
APP 播放器 android-UniversalMusicPlayer 谷歌教科书级音乐播放器 9.3k 5天
APP 播放器 ExoPlayer 谷歌出品可扩展媒体播放器 9.8k 29天
APP 播放器 Timber 音乐播放器 4.5k 3月
APP 播放器 ListenerMusicPlayer 开源音乐播放器 1.9k 1年
APP 新闻 AndroidFire 新闻阅读 App 框架 1.9k 11月
APP 新闻 GeekNews 涵盖*常用主流框架的阅读应用 2.8k 11月
APP MVP MvpApp MVP 架构学习 App 1.7k 11月
APP 教育 santa-tracker-android 谷歌开源的儿童教育和娱乐 App 1.2k 3月
APP 壁纸 muzei 定时更换桌面精美壁纸 App 3.5k 6天
面试 指南 interviews 软件工程技术面试个人指南 22k 15天
面试 题库 AndroidInterview-Q-A 国内一线互联网公司内部面试题库 7.2k 1月
学习 汇总 LearningNotes 学习笔记 8.9k 1月
学习 汇总 Android_Data Android 学习资料收集 7.1k 7月
学习 翻译 android-tech-frontier 定期翻译国外安卓优质文章 9.3k 1年
学习 源码分析 android-open-project-analysis Android 开源项目源码解析 6.2k 1年
学习 RxJava Awesome-RxJava RxJava 学习资源 4.3k 1年
学习 正则 learn-regex 轻松学习正则 14k 17天
学习 算法 awesome-java-leetcode 学习数据结构和算法、刷 LeetCode 3.7k 1月
学习 ADB awesome-adb ADB 用法大全 3.7k 1月
其他 大全 Android GitHub 上*火的 Android 开源项目 4.1k 6月
其他 大全 awesome-java Java框架、库与软件合集 16k 2月
其他 大全 awesome-android Android 实用资源合集 5.4k 1天
其他 大全 awesome-android-ui Android 好用的 UI 合集 29k 1月
其他 大全 Awesome-MaterialDesign Material Design 资源合集 5.4k 2年
其他 大全 AndroidLibs Android 开源代码大全 3.9k 1月
其他 大全 awesome-android-tips 收集常用的 Android 代码 2.2k 1月
其他 大全 android-open-project Android 开源项目分类汇总 26k 3月
其他 大全 android-architecture 谷歌关于架构的示例合集 26k 1月
其他 交流 android-discuss Android 问题交流讨论坛 3.4k 2年
补充 开发工具 PocketHub Android 版 Github 9.2k 13天
补充 开发工具 ActivityTracker 查看当前栈顶 Activity 0.3k 1年
补充 开发工具 lantern *利器 34k 1月

注:

  1. 『star 数』为该项目在 GitHub 中所获得的 start 数;
  2. 『*近更新』为该项目在 GitHub 中距离*近一次更新的时间;
  3. 『star 数』和『*近更新』是基于:2018-05-03 GitHub 项目数据进行参考。

详细介绍

scwang90 / SmartRefreshLayout

下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有*强的扩展性,集成了几十种炫酷的 Header 和 Footer。

SmartRefreshLayout 是一个“聪明”或者“智能”的下拉刷新布局,由于它的“智能”,它不只是支持所有的 View,还支持多层嵌套的视图结构。它继承自 ViewGroup 而不是 FrameLayout 或 LinearLayout,提高了性能。 也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 SwipeRefreshLayout,其他第三方的 Ultra-Pull-To-Refresh、TwinklingRefreshLayout 。还集成了各种炫酷的 Header 和 Footer。

项目地址:https://github.com/scwang90/SmartRefreshLayout
博客地址:https://segmentfault.com/a/1190000010066071

alibaba / vlayout

VirtualLayout 是一个针对 RecyclerView 的 LayoutManager 扩展, 主要提供一整套布局方案和布局间的组件复用的问题。

通过定制化的 LayoutManager,接管整个 RecyclerView 的布局逻辑;LayoutManager 管理了一系列 LayoutHelper,LayoutHelper 负责具体布局逻辑实现的地方;每一个 LayoutHelper 负责页面某一个范围内的组件布局;不同的 LayoutHelper 可以做不同的布局逻辑,因此可以在一个 RecyclerView 页面里提供异构的布局结构,这就能比系统自带的 LinearLayoutManager、aridLayoutManager 等提供更加丰富的能力。同时支持扩展 LayoutHelper 来提供更多的布局能力。

项目地址:https://github.com/alibaba/vlayout

markzhai / AndroidPerformanceMonitor

AndroidPerformanceMonitor(被称作 BlockCanary)是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。

取名为 BlockCanary 则是为了向 LeakCanary 致敬,顺便本库的 UI 部分是从 LeakCanary 改来的,之后可能会做一些调整。

项目地址:https://github.com/markzhai/AndroidPerformanceMonitor
中文文档:https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README_CN.md

seiginonakama / BlockCanaryEx

记录主线程中执行的所有方法和它们的执行时间,当 app 卡顿时,将所有耗时方法直接展示给开发者,节省开发者定位卡顿问题的时间。 此项目基于 BlockCanary。

BlockCanaryEx 和 BlockCanary 的区别如下:

  • BlockCanaryEx 的运行时代码修改自 BlockCanary,UI 和大部分功能基本一致;
  • BlockCanaryEx 添加了方法采样,知道主线程中所有方法的执行时间和执行次数;
  • 当应用卡顿时,BlockCanaryEx 更关注 app 代码中,哪些方法耗时*多,重点记录和显示这些耗时方法;
  • 添加了 gc 采样,当应用卡顿时,我们可以知道卡顿时是否发生了 gc,以及 gc 的时间;
  • 监控 view 性能,计算卡顿时,view的 measure、layout 和 draw 消耗的时间。

项目地址:https://github.com/seiginonakama/BlockCanaryEx
中文文档:https://github.com/seiginonakama/BlockCanaryEx/blob/master/README_ZH.md

frogermcs / AndroidDevMetrics

AndroidDevMetrics(原先叫 dagger2metrics)是一个性能检测库,用来检测 Activity 生命周期方法执行性能(onCreate(), onStart(), onResume())、帧速率性能和 Dagger 2 注入性能。它会告诉你在 app 中需要花多少时间来显示特定的界面,还有(如果你使用了Dagger 2)在依赖图表中提供每个对象消耗了多少时间。它不会告诉你性能问题或瓶颈的确切原因(目前!),但它可以指出你首先应该去查找的地方。

项目地址:https://github.com/frogermcs/AndroidDevMetrics

rmtheis / tess-two

文字识别一般都用的 Tesseract OCR ,它是由 Google 负责维护,是*好的开源 OCR Engine 之一,并且支持中文。不过因为 Tesseract 使用 C++ 实现的,在 Android 中不能直接使用,需要封装JavaAPI才能在Android平台中进行调用。

tess-two 是 TesseraToolsForAndroid(tesseract-adroid-tools)的一个分支,它添加了一些额外功能。TesseraToolsForAndroid 包含了 Tesseract OCR 和 Leptonica 图片处理库的一整套 API 和 build 文件。

项目地址:https://github.com/rmtheis/tess-two

huangyanbin / smartTable

Android 自动生成表格框架,支持二维数组展示,导入 Excel 表格,合并单元格等。还有很多功能点,包括动态添加首尾数据,分页,格式化字体,背景等。

SpringMVC与安卓之间的交互

接着上一篇 springMVC与jsp的交互,今天有空就测试了一下与安卓的交互
其实安卓与servlet交互和安卓与SpringMVC的交互一样就是改变一下,目前我用的是get方法访问SpringMVC,由于服务器程序沿用的是与上次jsp一样的代码,所以间接的进行了一次数据交互,把jsp的页面代码传到安卓上面来了
环境声明 :服务器环境与上一篇一样,安卓使用的是 Android studio 2.3.3

1、主要代码解释 #
A 服务器端程序 ##
package com.springmvc.test1;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import com.springmvc.pojo.RoleParams;

@Controller
@RequestMapping(“/tsetClass”)
public class SpringMVCTest1 {

@RequestMapping(“/testParams”)
public ModelAndView testParams(String roleName,String note) throws Exception{

System.out.println(“roleName===” + roleName);
System.out.println(“note===” + note);
ModelAndView mv = new ModelAndView();
mv.setViewName(“t2params”);//请看下面的图片
return mv;
}

}

mv.setViewName(“t2params”);就是把jsp中的内容返回了给安卓APP,角色名称、备注都只是个标识,在介绍安卓APP的时候就会发现APP上有同样的字眼

B 安卓APP程序 ##
package com.hemycoo.server.androidserverv1;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.hemycoo.server.androidserverv1.utils.HttpUtils;
import com.hemycoo.sever.javabean.Test;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

private EditText ed_number;
private EditText ed_pwd;
private TextView tv_status;

String path;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ed_number = (EditText) findViewById(R.id.ed_number);
ed_pwd = (EditText) findViewById(R.id.ed_pwd);
tv_status = (TextView) findViewById(R.id.login_status);

}

public void login(View v) throws IOException {

// 获得 QQ号码和 密码 , 然后登录
final String number = ed_number.getText().toString().trim();
final String pwd = ed_pwd.getText().toString().trim();

if (TextUtils.isEmpty(number) || TextUtils.isEmpty(pwd)) {
Toast.makeText(this, “号码或者密码不能为空”, Toast.LENGTH_SHORT).show();
return;
}
//使用okhtttp连接服务器
path = “http://10.149.72.101:8080/SpringMVC1024/tsetClass/testParams.action?roleName=”+number+”&”+”note=”+pwd;
//其中10.149.72.101为你本机的ip
HttpUtils.sendHttpRequest(path, new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
//Toast.makeText(MainActivity.this, “连接错误”,Toast.LENGTH_SHORT).show();
Log.e(“okhttpOnFailer”, “连接失败”);
}

@Override
public void onResponse(Call call, Response response) throws IOException {

String responseData = response.body().string();
if(responseData == null){
tv_status.setText(“null”);
return;
}

showResponse(responseData);
}
});

}

private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在这里进行UI操作,将结果显示到界面上
tv_status.setText(response);
}
});
}
}

其中okhttp的使用才是联网的重点,下面我先把我的工程目录截图,再粘贴okhttp联网工具我封装的代码

package com.hemycoo.server.androidserverv1.utils;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

public class HttpUtils {
public static final MediaType JSON= MediaType.parse(“application/json; charset=utf-8”);

public static void sendHttpRequest(String address,okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
}

public static void sendHttpRequestPost(String path, String json, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();

RequestBody requestBody = RequestBody.create(JSON ,json);

Request request = new Request.Builder()
.url(path)
.post(requestBody)
.build();
client.newCall(request).enqueue(callback);
}

}

我用的okhttp不是*新的,如有需要可以百度一下或者谷歌一下在github上会有新版本的介绍

2 效果显示 #
A 首先是服务器端 ##

前面两个是网址测试时候打印的,圈出来的是APP提交的。

B APP界面 ##

可以看出来账号密码就是提交给SpringMVC的,而下面的内容就是jsp的内容,就是服务器返回的
至此呢springMVC与前端的交互就完成了,虽然是基本的,但也足够了,别的只不过是在这个基础这个原理上的延伸。
与SpringMVC交互就是与SSM交互,都是一样的,这些都是简单的数据交互,与前端*大的困难其实就是数据交互,接下来遇到的新的数据交互问题在有空的时候再进行更新吧,写这篇主要是给初学者看的,毕竟培训机构也没有讲SpringMVC之类的与安卓的交互,网上的内容也不太多,我的程序在我的电脑上是完全能够运行的,看到这篇文章还有疑问的欢迎评论交流

Spring For Android初步

Spring For Android初步
Spring for Android 支持在Android环境下使用Spring框架,其意在简化Android本地开发。这包括能够在你的Android应用程序的Rest客户端使用RestTemplate。除了本次主要讲解的网络请求部分,Spring for Android还提供了基于OAuth支持将Spring Social的功能集成到Android应用程序, 授权客户机和实现流行的社交网站,如Twitter和Facebook。

RestTemplate Module

Spring的RestTemplate是一个健壮的、流行的基于java的REST client。Spring Android的RestTemplate模块提供一个能够在Android环境下工作的RestTemplate版本。

RestTemplate类是SFA RestTemplate组件包的核心类。他在概念上类似Spring框架其他同级项目中提供的模板类。RestTemlpate的行为表现取决于他提供的那些回调方法,同时通过配置合适的HttpMessageConverter 类,用户可以高效的将对象转换成HTTP请求中的信息或从响应消息中将信息转换回对应的对象。

每当创建一个新的RestTemplate实例,构造器就会生成配套的辅助对象用于支持RestTemplate的功能。以下是RestTemplate组件中一些提供支持的模块介绍。

HTTP Client

RestTemplate 提供了抽象的RESTful HTTP 请求的模块,内部实现中,RestTemplate 封装了原生的Android HTTP 客户端连接包。这包括标准的J2SE连接组件(用SimpleClientHttpRequestFactory封装)和HttpComponents HttpClient组件(用HttpComponentsClientHttpRequestFactory封装)。默认情况下具体使用哪种ClientHttpRequestFactory 取决于Android的版本。

@SuppressWarnings(“deprecation”)
protected HttpAccessor() {
if (httpClient43Present) {
this.requestFactory = new HttpComponentsClientHttpRequestFactory();
}
else if (okHttpPresent) {
this.requestFactory = new OkHttpClientHttpRequestFactory();
}
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
this.requestFactory = new SimpleClientHttpRequestFactory();
}
else {
this.requestFactory = new org.springframework.http.client.HttpComponentsAndroidClientHttpRequestFactory();
}
}
(2.3之后建议使用标准的J2SE连接组件)

 

Gzip压缩器

HTTP规范中允许通过在请求头中加入Accept-Encoding参数指定传输字节流的压缩方式。目前为止,RestTemplate 可以通过Gzip压缩组件支持在发送和接受时通过gzip(仅支持gzip)格式压缩过的数据。

对象-Json转换

如果需要支持这种转换,SFA的RestTemplate需要第三方Json数据映射包的支持。目前SFA提供三种包支持:Jackson JSON Processor, Jackson 2.x, 和 Google Gson。虽然Jackson 系列是有名的JSON解析包,但Gson的包更小,更适合生成小型的Android程序安装包。
SFA 将支持代码放在包 org.springframework.http.converter.json中。

RSS和Atom 摘要文件支持

RSS和Atom的支持也需要第三方包, Android ROME Feed Reader包就提供了相应的功能。

SFA 将支持代码放在包org.springframework.http.converter.feed 中。

所需要的包文件

spring-android-rest-template-{version}.jar

spring-android-core-{version}.jar

 

RestTemplate 构造器

下面列出四种RestTemplate 的构造方法。默认的构造方法不包含消息的转换器,因此必须自己添加消息转换器。

如上文所讲,如果需要一个特别ClientHttpRequestFactory ,也可以向构造器中传入一个ClientHttpRequestFactory 的实例参数。

RestTemplate();

RestTemplate(boolean includeDefaultConverters);

RestTemplate(ClientHttpRequestFactory requestFactory);

RestTemplate(boolean includeDefaultConverters, ClientHttpRequestFactory requestFactory);

 

RestTemplate API简介

RestTemplate 对应主要的六种Http 访问方法封装了6类高层调用方法,通过他们可以非常轻松且高效的完成对RESTful 服务的服务请求。

RestTemplate 的API方法命名遵循同样的规则:  method+return

比如getForObject() 将调用HTTP GET方法,同时将HTTP响应数据转换成你指定的对象类型并返回。而postForLocation() 将调用HTTP POST方法,将给定的对象转换成HTTP请求内容发送,返回的信息中将标识新的对象资源所在的URL。

当HTTP请求发生异常时,异常信息将被封装在RestClientException 中并被抛出,可以通过在RestTemplate中实现ResponseErrorHandler来捕获并处理。

restTemplate.setErrorHandler(errorHandler);

/*捕获http请求发生异常RestClientException*/

restTemplate.setErrorHandler(new ResponseErrorHandler() {

@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
//获得请求响应,通过判断执行不同的操作。。。
return false;//返回true表示有错误,false表示没有错误
}

@Override
public void handleError(ClientHttpResponse response) throws IOException {
//处理相应的错误操作。。。
//该方法只有在hasError方法中返回true时才会执行
}
});
网络请求方法(其他请求方式类似,可参考官方在线的API文档,链接在参考资料中):

HTTP GET

public <T> T getForObject(String url, Class<T> responseType, Object… urlVariables) throws RestClientException;

public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> urlVariables) throws RestClientException;

public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException;

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object… urlVariables);

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> urlVariables);

public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException;

 

HTTP POST

public URI postForLocation(String url, Object request, Object… urlVariables) throws RestClientException;

public URI postForLocation(String url, Object request, Map<String, ?> urlVariables);

public URI postForLocation(URI url, Object request) throws RestClientException;

public <T> T postForObject(String url, Object request, Class<T> responseType, Object… uriVariables);

public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables);

public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException;

public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Object… uriVariables);

public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;

public <T> ResponseEntity<T> postForEntity(URI url, Object request, Class<T> responseType) throws RestClientException;

HTTP 消息转换器

对象通过getForObject(), getForEntity(), postForLocation(), postForEntity(), postForObject() and put() 发送或者返回消息时都是通过HttpMessageConverter 的具体实现,从而转换成Http请求或者从Http应答中转换。从下面的HttpMessageConverter  API我们能对他的功能有个更深的认识。

public interface HttpMessageConverter<T> {
//判断给定的类型是否可以被转换器读取
//clazz 用于测试是否能够读取
//mediaType 读取的网络媒介类型,如果不指定,可以为null
//如果返回true表示可读,false表示其他情况
boolean canRead(Class<?> clazz, MediaType mediaType);
// 判断给定的类型是否可以被转换器写入
//clazz 用于测试是否能够写入
//mediaType 写入的网络媒介类型,如果不指定,可以为null
//如果返回true表示可写,false表示其他情况
boolean canWrite(Class<?> clazz, MediaType mediaType);

// 返回可被该转换器支持的header头消息类型
List<MediaType> getSupportedMediaTypes();

// 将给定的inputMessage消息转换成相应的类型对象并返回
// clazz 返回的类型,这个类型必须预先通过canRead方法,返回true
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;

// 将给定的对象转换后写入outputMessage
// t 写入outputMessage的对象,这个对象的类型必须预先通过canWrite方法,并返回true
// contentType  写入时的媒介类型,如果为null的话,则必须使用默认的内容类型转换器,否则,媒介类型必须预先通过canWrite方法且返回值为true
// outputMessage  要写入的消息
void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
其中,SFA框架已经提供了现成的MediaType(即mime类型)。

部分类型:

{ “.323”, “text/h323” },

{ “.3gp”, “video/3gpp” },

{ “.aab”, “application/x-authoware-bin” },

{ “.aam”, “application/x-authoware-map” },

{ “.aas”, “application/x-authoware-seg” },

{ “.acx”, “application/internet-property-stream” },

{ “.ai”, “application/postscript” },

{ “.aif”, “audio/x-aiff” },

{ “.aifc”, “audio/x-aiff” },

{ “.aiff”, “audio/x-aiff” },

{ “.als”, “audio/X-Alpha5” },

{ “.amc”, “application/x-mpeg” },

{ “.ani”, “application/octet-stream” },

{ “.apk”, “application/vnd.android.package-archive” },

{ “.asc”, “text/plain” }

默认的消息转换器

基于性能的选择考虑,默认的RestTemplate无参构造方法不包含任何消息转换器。但是,如果调用了布尔版本的构造方法并传递true,则构造器会为一些主要的mime类型增加转换器。当然自己也可以编写自定义的转换器,并通过messageConverters属性添加。
RestTemplate生成的转换器包括:ByteArrayHttpMessageConverter, StringHttpMessageConverter, 和ResourceHttpMessageConverter。如果Android的版本在2.2或以上,那么XmlAwareFormHttpMessageConverter 和SourceHttpMessageConverter也会被添加。否则,若在2,.1版本,因为缺少对XML的必要支持,这两个转换器会被FormHttpMessageConverter 代替。我们来看看代码中是如何初始化的。

如果不设置,则使用该默认的消息转换器:

/**
* Identifies and initializes default {@link HttpMessageConverter} implementations.
*/

private static class DefaultMessageConverters {
private static final boolean javaxXmlTransformPresent =
ClassUtils.isPresent(“javax.xml.transform.Source”, RestTemplate.class.getClassLoader());

private static final boolean simpleXmlPresent =
ClassUtils.isPresent(“org.simpleframework.xml.Serializer”, RestTemplate.class.getClassLoader());

private static final boolean jackson2Present =
ClassUtils.isPresent(“com.fasterxml.jackson.databind.ObjectMapper”, RestTemplate.class.getClassLoader()) &&
ClassUtils.isPresent(“com.fasterxml.jackson.core.JsonGenerator”, RestTemplate.class.getClassLoader());

private static final boolean gsonPresent =
ClassUtils.isPresent(“com.google.gson.Gson”, RestTemplate.class.getClassLoader());

public static void init(List<HttpMessageConverter<?>> messageConverters) {
messageConverters.add(new ByteArrayHttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
messageConverters.add(new ResourceHttpMessageConverter());

// if javax.xml.transform is not available, fall back to standard Form message converter
if (javaxXmlTransformPresent) {
messageConverters.add(new SourceHttpMessageConverter<Source>());
messageConverters.add(new AllEncompassingFormHttpMessageConverter());
}
else {
messageConverters.add(new FormHttpMessageConverter());
}
if (simpleXmlPresent) {
messageConverters.add(new SimpleXmlHttpMessageConverter());
}
if (jackson2Present) {
messageConverters.add(new MappingJackson2HttpMessageConverter());
}
else if (gsonPresent) {
messageConverters.add(new GsonHttpMessageConverter());
}
}
}
ByteArrayHttpMessageConverter

该转换器可以从HTTP请求或应答中读写字节数组,默认情况下,该转换器支持所有的media types (*/*),同时写数据会以Content-Type为application/octet-stream(任意二进制数据)的形式。

FormHttpMessageConverter

能处理格式化的数据。支持用application/x-www-form-urlencoded(格式化编码数据)和multipart/form-data(多组件格式数据)的读写转换,格式化的数据通常用一个MultiValueMap<String, String>数据结构来读写。

XmlAwareFormHttpMessageConverter

是FormHttpMessageConverter的扩展,通过SourceHttpMessageConverter增加了对XML转换的支持。

ResourceHttpMessageConverter

能处理资源。支持对所有类型的读操作,写资源支持application/octet-stream。

SourceHttpMessageConverter

可以将请求或应答数据转换成javax.xml.transform.Source类型,只支持DOMSource, SAXSource, 和StreamSource三种类型。默认情况下支持text/xml和 application/xml两种XML可扩展标记语言MIME类型。

StringHttpMessageConverter

可以将请求或应答数据转换成String类型,支持所有的text media类型(text/*),支持Content-Type为text/plain(原文数据)写数据。

SimpleXmlHttpMessageConverter

支持对XML格式的读写处理,需要第三方包Simple XML serializer。XML的映射工作可以通过该包提供的注解方式进行配置。如果有需要提供附加的控制功能,可以通过切面的形式通过一个可定制的Serializer进行功能的加强。默认情况下,支持读写application/xml, text/xml, 和application/*+xml这几种MIME类型。

需要注意的是,此框架和Spring OXM并不兼容。他是用在SFA中的独立的第三方XML串行化实现。基于maven的依赖如下

<dependency>
<groupId>org.simpleframework</groupId>
<artifactId>simple-xml</artifactId>
<version>${simple-version}</version>
</dependency>

MappingJackson2HttpMessageConverter
基于Jackson框架提供对请求与应答数据的Json-Obejct转换。对于Json的映射配置可以Jackson提供的注解支持。当串行化/反串行化需要时也支持切面式的控制管理,默认支持application/json类型的读写。
请注意该转换器和GsonHttpMessageConverter 转换器都支持application/json类型的数据转换,因此*好只添加一款转换器,因为RestTemplate 会优先选择他*早匹配到的转换器进行数据转换,所以两款转换器都添加会导致不可预料的结果。

MappingJackson2HttpMessageConverter如果不是通过maven而是手工添加,还需要在lib包中引入jackson-annotations和jackson-core jars。

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>

也可以通过MappingJacksonHttpMessageConverter支持 Jackson JSON Processor包。同样,手工导入需要引入jackson-core-asl jar。

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson-version}</version>
</dependency>
GsonHttpMessageConverter
基本上和MappingJackson2HttpMessageConverter的功能一直,也支持注解和切面式。

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson-version}</version>
</dependency>
(以上也可以使用gradle插件进行配置)

使用gzip压缩

// 添加 Accept-Encoding 消息头属性,设置为gzip
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAcceptEncoding(ContentCodingType.GZIP);
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
// 注意调用的方法
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);

Gzip压缩能有效的减少通讯传输的信息量。Gzip格式传输必须在服务器端被支持。通过将内容的请求头Accept-Encoding设置为gzip,可以向服务器端请求使用gzip压缩传输。如果服务器端支持,将返回压缩后的数据。RestTemplate 将检查Content-Encoding属性判断应答返回数据是否是压缩过的,是则用GZIPInputStream 去解压缩。目前Content-Encoding仅支持gzip格式。
需要注意,如果在2.3或以后的版本使用基于J2SE的标准连接SimpleClientHttpRequestFactory,Android框架会自动在Accept-Encoding中设置gzip,如果希望是gzip压缩失效,必须在header信息中增加其他标志值:
HttpHeaders requestHeaders = new HttpHeaders();
//增加如下标识
requestHeaders.setAcceptEncoding(ContentCodingType.IDENTITY);
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
通过GET方式获取JSON数据

首先需要定义一个与返回的JSON格式对应的POJO类。

public class Event {
private Long id;
private String title;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public String setTitle(String title) {
this.title = title;
}
}
使用Rest请求:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Event[] events = restTemplate.getForObject(url, Event[].class);

也可以通过设置请求头Accept信息的方式
// 显式设置 Accept header
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Collections.singletonList(new MediaType(“application”,”json”)));
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity<Event[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, Event[].class);
Event[] events = responseEntity.getBody();

其中MappingJackson2HttpMessageConverter可以换成GsonHttpMessageConverter,作为另一种实现JSON解析的选择。

 

通过GET方式获取 XML 数据

我们使用刚刚用过的Event对象来演示XML的使用方法,注意Event的类及属性都有注解。

@Root
public class Event {
@Element
private Long id;
@Element
private String title;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public String setTitle(String title) {
this.title = title;
}
}
如果需要解析一组Event的数据,我们还需要定义基于List的包装类。

@Root(name=”events”)
public class EventList {
@ElementList(inline=true)
private List<Event> events;
public List<Event> getEvents() {
return events;
}
public void setEvents(List<Event> events) {
this.events = events;
}
}
编写请求代码如下:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new SimpleXmlHttpMessageConverter());
EventList eventList = restTemplate.getForObject(url, EventList.class);
和刚才一样,也可以通过设置请求头Accept信息的方式:

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Collections.singletonList(new MediaType(“application”,”xml”)));
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new SimpleXmlHttpMessageConverter());
ResponseEntity<EventList> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, EventList.class);
EventList eventList = responseEntity.getBody();
通过POST的方式发送 JSON 数据

我们定义了如下的POJO用于演示:

public class Message {
private long id;
private String subject;
private String text;
public void setId(long id) {
this.id = id;
}
public long getId() {
return id;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getSubject() {
return subject;
}
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
接着是编辑数据和发送请求的代码

// 编辑数据
Message message = new Message();
message.setId(555);
message.setSubject(“test subject”);
message.setText(“test text”);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
String response = restTemplate.postForObject(url, message, String.class);
同样,通过设置请求头Content-Type信息也是可以的

// 编辑数据
Message message = new Message();
message.setId(555);
message.setSubject(“test subject”);
message.setText(“test text”);
// 设置 Content-Type
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(new MediaType(“application”,”json”));
HttpEntity<Message> requestEntity = new HttpEntity<Message>(message, requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
String result = responseEntity.getBody();
(注意:如果想用spring for android的json解析功能,服务器需要返回的type类型应该为application/json而不是通常的text/html)

其他: Spring for Android还提供了三方授权,本身提供facebook和twtter的三方授,需要第三方包的支持。提供了Spring Social组件用于创建自己的连接工厂,并提供加密和保存信息的功能。

Spring for Android的核心部分比较强调服务器和客户端之间的数据交流,服务器需要确实返回指定的MIME类型,客户端才能进行更加简便的数据解析。

spring-android的使用

了解J2EE的人都会知道spring这个开源框架,不过哥对J2EE的开发没什么兴趣,太重量级了,不适合互联网的应用,还是喜欢php多点,不过sping在移动开发这块也推出了spring-android,spring-android可以做什么?有什么优势呢?

spring-android主要提供了两个重要的功能:

1.Rest模板,很多Android应用都要与服务器进行交互,而现在很多互联网应用的服务器端都会提供Rest服务,数据格式一般是json、xml、rss等,如果使用spring-android,这将大大方便你的Android应用与服务器端的交互,spring-android在解析json,xml都是非常方便的;

2.Auth授权验证,现在很多互联网应用都提供了开放的API服务,而你的Android应用要接入到这些服务中去,往往要经过授权才行,现在很多应用都使用Auth授权认证,如twitter、facebook、新浪微博等,如果使用spring-android,在授权验证这块将会非常方便。

如何使用spring-android呢?

1.首先要去http://www.springsource.org/spring-android 下载spring-android,然后解压。

2.新建一个Android项目,然后将解压后的spring-android里的spring-android-core-1.0.1.RELEASE.jar和spring-android-rest-template-1.0.1.RELEASE.jar放到Android项目的lib目录下,因为要访问在网络,所以要在AndroidManifest.xml文件下加入<uses-permission android:name=”android.permission.INTERNET”/>​

3.acitivity_main.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
< RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
     xmlns:tools = "http://schemas.android.com/tools"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"
     >
     < TextView
         android:id = "@+id/result_text"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:layout_centerHorizontal = "true"
         android:layout_centerVertical = "true"
         tools:context = ".MainActivity" />
</ RelativeLayout >

4.MainActivity.java如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.hxxy.springforandroidfirstdemo;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         final TextView resultTextView = (TextView) findViewById(R.id.result_text);
         AsyncTask<String, Void, String> simpleGetTask =  new AsyncTask<String, Void, String>() {
             @Override
             protected String doInBackground(String... params) {
                 // executed by a background thread
                 // 创建一个RestTemplate实例
                 RestTemplate restTemplate = new RestTemplate();
                 // 添加字符串消息转换器
                 restTemplate.getMessageConverters().add( new StringHttpMessageConverter());
                 return restTemplate.getForObject(params[ 0 ], String. class );
             }
             @Override
             protected void onPostExecute(String result) {
                 resultTextView.setText(result);
             }
         };
         String url = "http://www.chenwg.com" ;
         // 完成时更新resultTextView
         simpleGetTask.execute(url);
     }
}

 

android 实现类似个人中心的界面设计

From:android 实现类似个人中心的界面设计

上效果图:
这里写图片描述
这里写图片描述

先理清设计思路:
1、外层用linearlayout包裹,linearlayout采用shape,搭上描边、圆角和填充背景色。
2、里层采用relativelayout填充进textview、imageview。
思路搞清后,很简单就两步。
先上布局代码:

  1. <LinearLayout style=“@style/PersonalMainLayoutStyle” >
  2. <RelativeLayout style=“@style/FindBottomStyle” >
  3. <TextView
  4. style=“@style/PersonalTextStyle”
  5. android:text=“我的订单” />
  6. <ImageView
  7. android:id=“@+id/iv_drop_down”
  8. style=“@style/PersonalRightIconStyle”
  9. android:src=“@drawable/android_list_idex” />
  10. </RelativeLayout>
  11. </LinearLayout>

 

linearlayout布局属性代码:

  1. <style name=“PersonalMainLayoutStyle”>
  2. <item name=“android:layout_width”>match_parent</item>
  3. <item name=“android:layout_height”>wrap_content</item>
  4. <item name=“android:layout_margin”>10dp</item>
  5. <item name=“android:background”>@drawable/background_corners</item>
  6. <item name=“android:orientation”>vertical</item>
  7. <item name=“android:padding”>1dp</item>
  8. </style>

 

relativelayout布局属性代码:

  1. <style name=“FindBottomStyle”>
  2. <item name=“android:layout_width”>match_parent</item>
  3. <item name=“android:layout_height”>30dp</item>
  4. <item name=“android:layout_margin”>5dp</item>
  5. <item name=“android:background”>@drawable/more_activity_item_selector_bottom_corners</item>
  6. </style>

 

textview和imageview的属性代码可以自己设计了。

下面是drawable的设计代码.
看到上边relativelayout的item中引用了drawable-more_activity_item_selector_bottom_corners,个人感觉好像没什么卵用,主要是linearlayout的drawable,但是我没试,还是贴出来吧
relativelayout-drawable:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <selector
  3. xmlns:android=“http://schemas.android.com/apk/res/android”>
  4. <item android:state_pressed=“true”>
  5. <shape>
  6. <solid android:color=“#ffffe381” />
  7. <stroke android:width=“0.0dip” android:color=“#ffcccccc” />
  8. <corners android:bottomLeftRadius=“6.0dip” android:bottomRightRadius=“6.0dip” />
  9. </shape>
  10. </item>
  11. <item>
  12. <shape>
  13. <solid android:color=“#ffffffff” />
  14. <stroke android:width=“0.0dip” android:color=“#ffcccccc” />
  15. <corners android:bottomLeftRadius=“6.0dip” android:bottomRightRadius=“6.0dip” />
  16. </shape>
  17. </item>
  18. </selector>

 

linearlayout-drawable:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <selector xmlns:android=“http://schemas.android.com/apk/res/android”>
  3. <item><shape>
  4. <solid android:color=“#ffffffff” />
  5. <stroke android:width=“1.0dip” android:color=“#ffcccccc” />
  6. <corners android:radius=“6.0dip” />
  7. </shape></item>
  8. </selector>

 

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速