URI和URL

URI(Universal Resource Identifier)是通用资源标志符

通常由三部分组成:

  1. 访问资源的命名机制
  2. 存放资源的主机名
  3. 资源自身的名称
    http://www.baidu.com/img/bdlogo.png可以解释为
  4. 一个可以通过HTTP协议访问的资源
  5. 位于主机www.baidu.com
  6. 通过/img/bdlogo.png访问

URL

URL是URI的一个子集,是Uniform Resource Locator的缩写,译为统一资源定位符,简而言之URL是Internet上描述信息资源的字符串。
URL的一般格式为(带方括号[]为可选项)
protocol://hostname[:port]/path/[parameters][?query]# fragment

  1. 第一部分是协议
  2. 第二部分为存有资源的主机IP也可能包括端口号
  3. 第三部分是主机资源的具体地址,如目录和文件名等

区别

URI属于URL更低级层次的抽象,一种字符串文本标准
URI表示请求服务器的路径定义一个资源,而URL同时说明要如何访问这个资源

抓取网页内容

1
2
3
4
import urllib2
response = urllib2.urlopen('http://www.baidu.com')
html = response.read()
print html

使用请求

1
2
3
4
5
import urllib2
req = urllib2.Request('http://www.baidu.com')
response = urllib2.urlopen(req)
the_page = respense.read()
print the_page

Post请求

1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib
import urllib2

url = 'http://www.someserver.com/register.cgi'

values = {'name':'WHY',
'location':'SDU',
'language','Python'}

data = urllib.urlencode(values)
req = urllib2.Request(url,data)
response = urllib2.urlopen(req)
the_page = response.read()

GET请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib2
import urllib

data = {}

data['name'] = 'WHY'
data['location'] = 'SDU'
data['language'] = 'Python'

url_values = urllib.urlencode(data)
print url_values

name = Somebody + Here&language=Python&location=Northampton
url = 'http://www.example.com/example.cgi'
full_url = url + '?' + url_values

data = urllib2.open(full_url)

设置Headers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import urllib
import urllib2

url = 'http://www.someserver.com/cgi-bn/register.cgi'

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5;Windows NT)'
values = {'name':'WHY',
'location':'SDU',
'language':'Python'}
headers = {'User-Agent':user_agent}
data = urllib.urlencode(values)
req = urllib2.Request(url,data,headers)
response = urllib.urlopen(req)
the_page = response.read()

异常

URLError

通常,URLError在没用网络连接(没有路由到特定服务器)或者服务器不存在产生
这种情况下,异常同样会带有reason属性,他是一个tuple
包含了一个错误号和一个错误信息

1
2
3
4
5
6
7
8
import urllib2

req = urllib2.Request('http://www.baibai.com')

try: urllib2.urlopen(req)

except urllib2.URLError,e:
print e.reason

HTTPError

服务器上每个HTTP应答对象response包含一个数字”状态码”
有时状态码服务器无法完成请求,默认的处理器会为你处理一部分应答
HTTP状态码分别以1~5开头由3位整数组成:

  • 200:请求成功,处理方式:获得相应的内容,进行处理
  • 201:请求完成,结果是创建了新资源,心创建资源的URI可再响应的实体中得到
  • 202:请求被接受,处理尚未完成 处理方式:阻塞等待
  • 204:服务器已经实现了请求,但没有返回心的信息,如果客户是用户代理,则无须为此更新自身的文档视图,处理方式 丢弃
  • 300: 作为3XX类型回应的默认解释,存在多个可用的被请求资源。处理方式:若程序中能够处理,则进行进一步处理,如果程序不能处理,则丢弃
  • 301:请求到飞资源都会被分配一个永久的URL,这个就可以在将来通过URL来访问此资源,处理方式:重定向到分配的URL
  • 302:请求到的资源在一个不同的URL处临时保存,处理方式:重新向到临时的URL
  • 400:非法请求 处理方式 丢弃
  • 401:未授权 处理方式 丢弃
  • 403:禁止 处理方式 丢弃
  • 404:没有找到 处理方式 丢弃
  • 5XX:服务器错误,处理方式 丢弃

    HTTPError产生后会有一个整形code属性,是服务器发送的行管错误
    BaseHTTPServer.BaseHTTPRequestHandler.reponse是一个很有用的应答号码字典,显示HTTP协议使用所有的应答号
    1
    2
    3
    4
    5
    6
    7
    import urllib2
    req = urllib2.Request('http://bbs.csdn.net/callmewhy')

    try:
    urllb2.urlopen(req)
    except urllib2.URLError, e:
    print e.code

  • android:numColumns=”auto_fit” 列数设置为自动
  • android:columnWitdh 列的宽度
  • android:stretchMode=”columnWidth” 缩放模式,如何填满空余位置,columnWitdh分摊给item宽度,SpacingWidth分摊给间隔,none无,spacingWidthUniform每一列间隔均匀地缩放
  • android:verticalSpacing 行间距
  • android:horizontalSpacing 列间距
  • android:cacheColorHint 拖动默认背景
  • android:scrollbars 滚动条是否显示
  • android:fadeScrollbars 是否自动隐藏滚动条
  • android:fastScrollEnabled 是否支持快速滚动
  • android:fadingEdge 褪去边缘颜色
  • android:fadingEdgeLength 褪去边缘的长度
  • android:stackFromBottom 列表显示最下面
  • android:transcriptMode=”alwaysScroll” 动态添加数据时,列表将自动往下滚动最新的条目可以自动滚动到可视范围内
  • android:drawSelectorOnTop 点击某条记录不放,颜色会在记录的后面成为背景色,内容的文字可见

  • android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,显示为可点击的链接,可选值(none/web/email/phone/map/all)
  • android:bufferType 指定getTexy()方式取得的文本类型,选项editable类似StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。
  • android:capitalize 设置英文字母大写类型
  • android:cursorVisible 设置光标为显示/隐藏,默认显示
  • android:digits 设置允许输入哪些字符
  • android:drawableBottom在text的下方输入一个drawable
  • android:drawableLeft 在左边输出一个drawable
  • android:drawablePadding 设置text与drawable的间隔
  • android:drawbaleRight 在右边输出一个drawable
  • android:drawbaleTop 在上方输出一个drawable
  • android:editable 设置是否可编辑
  • android:editorExtras 设置文本的额外输入数据
  • android:ellipsize 设置文字过长时,该控件该如何显示,可选值设置start省略号显示在开头,end省略号显示在结尾,middle省略号显示在中间,marquee以跑马灯的方式显示
  • android:freezesText 设置保存文本的内容以及光标位置
  • android:gravity 设置文本位置
  • android:hintText 为空时显示的文本提示信息
  • android:imeOptions 附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角显示“完成”,而不设置显示默认是一个回车
  • android:imeActionId 设置IME动作ID
  • android:imeActionLabel 设置IME动作标签
  • android:inputMethod 为文本指定输入法
  • android:inputType 设置文本的类型,用于帮助输入法显示合适的键盘类型
  • android:linksClickable 设置连接是否可以dianji
  • android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,marquee_forever时表示无限次
  • android:ems设置TextView的宽度为N个字符的宽度
  • android:maxEms 设置TextView的宽度为最长为N个字符的宽度
  • android:minEms 设置TextView的宽度为最短为N个字符的宽度
  • android:maxLength 限制显示的文本长度,超出部分不显示
  • android:lines 设置文本的行数,设置两行就显示两行,即使第二行没有数据
  • android:maxLines 设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自定换行,超出行数将不显示
  • android:minLines 设置文本的最小行数
  • android:lineSpacingExtra设置行间距
  • android:lineSpacingMultiplier设置行间距的倍数
  • android:numeric 设置后TextView有点击效果
  • android:password 以.显示文本
  • android:phoneNumber 设置为电话号码的输入方式
  • android:privateImeOptions 设置输入法选项
  • android:scorllHorizontally 设置文本超出宽度的情况下,是否出现横拉条
  • android:selectAllOnFocus 如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。 TextView中设置后无效果
  • android:shadowColor 指定文本阴影的颜色,需要与shadowRadius一起使用
  • android:shadowDx设置阴影横向坐标开始位置
  • android:shadowDy设置阴影纵向坐标开始位置
  • android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好
  • android:singleLine设置单行显示
  • android:singleLine=”true”显示单行
  • android:textAppearance设置文字外观。如 “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
  • android:textColor 设置文本颜色
  • android:textColorHighlight 被选中文字的底色,默认为蓝色
  • android:textColorLink 文字连接的颜色
  • android:textColorHint 设置提示信息的颜色,默认是灰色
  • android:textScaleX 设置文字自检间隔,默认为1.0f
  • android:textSize 设置文字大小,推荐度量单位sp
  • android:textStyle 设置字形[bold(粗体),italic(斜体),bolditalic(又粗又斜)]
  • android:typeface 设置字体,必须是以下常量值之一:normal 0,sans 1,serif 2,monospace(等宽字体) 3
  • android:height 设置文本区域的高度,支持度量单位 px/dp/sp/in/mm
  • android:maxHeight 设置文本区域的最大高度
  • android:minHeight 设置文本区域的最小高度
  • android:width 设置文本区域的宽度
  • android:maxWidth 设置文本区域的最大宽度
  • android:minWidth 设置文本区域的最小宽度

EventBus是Android上一个事件发送/接受的解决方案之一

  • 简化了组建之间的通信
    • 事件有发送方和接收方
    • 执行在Activity、Fragment和后台进程上
    • 避免了复杂的、容易出错的依赖和生命周期问题
  • 快速、轻便、稳定
  • 拥有先进的功能,如交付线程、用户优先级

    Read More


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<com.andexert.library.RippleView
android:id="@+id/more"
ripple:rv_centered="true"
android:layout_width="120dp"
android:layout_height="60dp"
android:layout_margin="5dp">

<ImageView
android:layout_width="120dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:background="@android:color/holo_blue_light"
android:padding="10dp"
android:src="@android:drawable/ic_menu_edit" />

</com.andexert.library.RippleView>

定制属性

  • app:rv_alpha:波纹的透明度,integer类型,默认为90,范围0-255
  • app:rv_framerate:波纹放大过程中的步进,integer类型,默认10
  • app:rv_rippleDuration:波纹动画的间隔,integer类型,默认400
  • app:paddingStart:波纹其实padding
  • app:paddingEnd:波纹结束padding
  • app:rv_color:波纹的颜色,color类型,默认是白色
  • app:rv_centered:是否在控件的最中间,boolean类型,默认false
  • app:rv_type:波纹类型,enum类型(simpleRipple,doubleRipple,rectangle),默认simpleRipple
  • app:rv_zoom:是否开启放大动画,boolean类型,默认false
  • app:rv_zoomDuration:放大动画的时间,integer类型,默认150
  • app:rv_zoomScale:放大动画,integer类型,默认1.03

提示


创建代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void dialog(){
AlertDialog.Builder builder = new Builder(mContext);
builder.setMessage("确定退出么?");
builder.setTitle("提示");
builder.setPostiveButton("确认",new OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which) {
dilog.dismiss();
//
}
});
builder.setNegativeButton("取消",new OnClickListner(){
@Override
public void onClick(DialogInterface dialog,int which){
dialog.dismiss();
}
});
builder.create().show();
}

三个按钮


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dialog dialog = new AlertDialog.Builder(this).setIcon(
   android.R.drawable.btn_star).setTitle("喜好调查").setMessage(
   "你喜欢李连杰的电影吗?").setPositiveButton("很喜欢",
   new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
   Toast.makeText(Main.this, "我很喜欢他的电影。",
   Toast.LENGTH_LONG).show();
   }
   }).setNegativeButton("不喜欢", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
   Toast.makeText(Main.this, "我不喜欢他的电影。", Toast.LENGTH_LONG)
   .show();
   }
   }).setNeutralButton("一般", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
   Toast.makeText(Main.this, "谈不上喜欢不喜欢。", Toast.LENGTH_LONG)
   .show();
   }
   }).create();
   dialog.show();

简单的自定View


1
2
3
new AlerDialog.Builder(mContext).setTitle("请输入").setIcon(android.R.drawable.ic_dialog_info)
.setView(new EditText(this)).setPositiveButton("确定",null)
.setNegativeButton("取消",null).show()

消息内容一组单选框


1
2
3
4
5
new AlerDialog.Builder(mContext).setTitle("单选框")
.setMultiChoiceItems(
new String[]{"Item1","Item2"},null,null)
.setPositiveButton("确定",null)
.setNegativeButton("取消",null).show();

消息内容是一组多选框


1
2
3
4
5
6
7
8
new AlerDialog.Builder(mContext).setTitle("多选框")
.setIcon(android.R.drawable.ic_dialog_info)
.setSingleChoiceItems(new String[]{"Item1","Item2"},0
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
dialog.dismiss();
}
}).setNegativeButton("取消",null).show();

信息内容是一组简单列表项


java
new AlertDialog.Builder(this).setTitle(“列表框”).setItems(
   new String[] { “Item1”, “Item2” }, null).setNegativeButton(
   “确定”, null).show();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 信息内容自定义布局
![](/img/14110607.png)
```xml
<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_height="wrap_content" android:layout_width="wrap_content"
   android:background="# ffffffff" android:orientation="horizontal"
   android:id="@+id/dialog">
   <TextView android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:id="@+id/tvname" android:text="姓名:" />
   <EditText android:layout_height="wrap_content"
   android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>
</LinearLayout>

1
2
3
4
5
6
LayoutInflater inflater = getLayoutInflater();
   View layout = inflater.inflate(R.layout.dialog,
   (ViewGroup) findViewById(R.id.dialog));
   new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
   .setPositiveButton("确定", null)
   .setNegativeButton("取消", null).show();