熟悉 Android 与 Linux 的开发者看到这篇弱弱的文章该会嘲笑了,不过这篇文章是写给那些还不知道的开发者的。当然如果你对此比较熟悉,又打算看下去,我会感到很高兴的。:)

众所周知,Android 是基于 Linux 的,因此大家都可以想到,Android 应该可以运行 Linux 下的程序,但是该平台是采用的 ARM 的处理器,因此哪里去找一款 ARM Linux 的编译器呢?这里我向大家推荐 Sourcery G++ 这款编译器,下载地址是:

http://www.codesourcery.com/sgpp/lite/arm/portal/release1803

因为我的系统是 Windows,因此我下载了 IA32 Windows Installer ,按照安装提示一步步安装完毕后,我们就可以用 C/C++ 来写程序,用它编译后放在 AVD 或你的实机上运行了。 

下面是我用 C 写的一个 Hello World 程序。

#include <stdio.h>

int main(void)
{
	char s[20];
	scanf("%s",s);
	printf("Hello world, from %s.\n",s);
	return 0;
}

保存为 hello.c,因为 Android 的 Linux 内核没有标准IO库函数,因此我们采用静态编译的方式进行编译。

arm-none-linux-gnueabi-gcc -static -o hello hello.c

然后我们使用 adb 将 hello 程序上传在 AVD 或你的实机的 /data 目录下。你可能会有疑问,为什么要上传到这个目录呢?呵呵,其实是因为 Android 的 /system/bin 与 /sbin 目录是 Read Only System,而 /mnt/sdcard 下面所有的文件所有者用户是 system,权限组是 sdcard_r,就算是 root 账户也无法增加文件的可执行权限。当然你也有可能找到其他可上传又可改文件权限的目录。

adb push hello /data

然后我们用 adb shell 命令进入你的 Android 设备的 shell 里,更改它的权限。

adb shell

cd /data

chmod 777 hello 

下面是执行的结果:

./hello

newcj

Hello world, from newcj.

怎么样,有意思吧,赶快去试试吧,我相信你也会感到有趣的!

posted @ 2011-08-14 23:02 newcj 阅读(1233) 评论(1) 编辑

之前一直搞不很明白 AndroidManifest.xml 中 activity 标签下的 intent-filter 中 data 标签的属性含义,今天认真看了 Dev Guide,又在网上查询了大量相关资料,现把 data 标签中的属性含义做一个总结。
 

一、定义
 

scheme, host, port, path, pathPrefix, pathPattern 是用来匹配 Intent 中的 Data Uri 的。具体规则如下:
 

  scheme://host:port/path or pathPrefix or pathPattern
 

这里需要注意的是这里的 scheme 不是 schema,也许你记得 xmlns:android="http://schemas.android.com/apk/res/android" 这段声明,你就会想起其中的 schema (至少我是这样想到了...- -!),但这里的 scheme 不是 schema。虽然在写 AndroidManifest.xml 的时候,有智能提示,但是希望大家还是能注意到。

上面那句最后的 “path or pathPrefix or pathPattern” 是指后面的 path 验证可以使用 data 属性中的 android:path、android:pathPrefix 或 pathPattern,你可以添加任意个 data 标签,由于是 “or” ,因此,只要其中任意一个 data 匹配,系统就会选择你的 Activity 启动,当然,如果别的 Activity 也有相同的 data 标签,系统就会给用户弹出一个 Chooser Dialog。


mimeType 也是是用来匹配 Intent 的。比如,当你使用 Intent.setType("text/plain") ,那么系统将会匹配到所有注册 android:mimeType="text/plain" 的 Activity,想获取更多有关 mimeType 的知识请参考:【转】备份:Android 常用 mimeType 表

这里需要十分注意的是 Intent.setType(), Intent.setData,Intent.setDataAndType() 这三个方法!
 

  • setType 调用后设置 mimeType,然后将 data 置为 null;
  • setData 调用后设置 data,然后将 mimeType 置为 null;
  • setDataAndType 调用后才会同时设置 data 与 mimeType。
     
另外需要注意的是,如果你在 data 标签,既设置了 mimeType 又设置了 scheme 之内的,那么你的 Intent 需要同时设置匹配的 data 与 mimeType 即调用 setDataAndType ,系统才能匹配到这个 Activity(即便你 mimeType 设置为 "*/*" 也是如此)。当然,如果你没有设置 mimeType,那么调用 setData 进行匹配,如果你设置了任何的 mimeType 将不会匹配到该 Activity。

二、区别

  这里主要说的区别是 pathpathPrefixpathPattern 之间的区别
 
  • path 用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
  • pathPrefix 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
  • pathPattern 用表达式来匹配整个路径,这里需要说下匹配符号与转义。
匹配符号:
  1. “*” 用来匹配0次或更多,如:“a*” 可以匹配“a”、“aa”、“aaa”...
  2. “.” 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”...
  3. 因此 “.*” 就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”...
转义:
因为当读取 Xml 的时候,“\” 是被当作转义字符的(当它被用作 pathPattern 转义之前),因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。如:“*” 这个字符就应该写成 “\\*”,“\” 这个字符就应该写成 “\\\\”。


三、一些例子

  例子1:如果我们想要匹配 http 以 “.pdf” 结尾的路径,使得别的程序想要打开网络 pdf 时,用户能够可以选择我们的程序进行下载查看。

我们可以将 scheme 设置为 “http”,pathPattern 设置为 “.*\\.pdf”,整个 intent-filter 设置为:
View Code
1 <intent-filter>
2 <action android:name="android.intent.action.VIEW"></action>
3 <category android:name="android.intent.category.DEFAULT"></category>
4 <data android:scheme="http" android:pathPattern=".*\\.pdf"></data>
5 </intent-filter>

如果你只想处理某个站点的 pdf,那么在 data 标签里增加  android:host="yoursite.com" 则只会匹配 http://yoursite.com/xxx/xxx.pdf,但这不会匹配 www.yoursite.com,如果你也想匹配这个站点的话,你就需要再添加一个 data 标签,除了 android:host 改为 “www.yoursite.com” 其他都一样。
 

例子2:如果我们做的是一个IM应用,或是其他类似于微博之类的应用,如何让别人通过 Intent 进行调用分享出现在选择框里呢?
 
我们只用注册 android.intent.action.SEND 与 mimeType 为 “text/plain” 或 “*/*” 就可以了,整个 intent-filter 设置为:
View Code
1 <intent-filter>
2 <action android:name="android.intent.action.SEND" />
3 <category android:name="android.intent.category.DEFAULT" />
4 <data mimeType="*/*" />
5 </intent-filter>

这里设置 category 的原因是,创建的 Intent 的实例默认 category 就包含了 Intent.CATEGORY_DEFAULT ,google 这样做的原因是为了让这个 Intent 始终有一个 category。


例子3:如果我们做的是一个音乐播放软件,当文件浏览器打开某音乐文件的时候,使我们的应用能够出现在选择框里?
 
这类似于文件关联了,其实做起来跟上面一样,也很简单,我们只用注册 android.intent.action.VIEW 与 mimeType 为 “audio/*” 就可以了,整个 intent-filter 设置为:
View Code
1 <intent-filter>
2 <action android:name="android.intent.action.VIEW" />
3 <category android:name="android.intent.category.DEFAULT" />
4 <data android:mimeType="audio/*" />
5 </intent-filter>


参考:
【2】备份:Android 常用 mimeType 表 http://www.cnblogs.com/newcj/archive/2011/08/10/2134305.html
posted @ 2011-08-11 17:00 newcj 阅读(2070) 评论(0) 编辑

转自:http://www.cnblogs.com/Rooty/archive/2011/07/16/2107962.html

一、MIME TYPE描述

多用途互联网邮件扩展MIMEMultipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。

内容类型(Content-Type),这个头部领域用于指定消息的类型。一般以下面的形式出现。[type]/[subtype]

type有下面的形式。

  • Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
  • Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
  • Application:用于传输应用程序数据或者二进制数据;
  • Message:用于包装一个E-mail消息;
  • Image:用于传输静态图片数据;
  • Audio:用于传输音频或者音声数据;
  • Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发,MIME使用Internet Assigned Numbers Authority (IANA)作为中心的注册机制来管理这些值。常用的subtype值如下所示:

  • text/plain(纯文本
  • text/html(HTML文档)
  • application/xhtml+xml(XHTML文档)
  • image/gif(GIF图像)
  • image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
  • image/png(PNG图像)【PHP中为:image/x-png】
  • video/mpeg(MPEG动画)
  • application/octet-stream(任意的二进制数据)
  • application/pdf(PDF文档)
  • application/msword(Microsoft Word文件)
  • message/rfc822(RFC 822形式)
  • multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
  • application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
  • multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)

二、常用MIME Type表

转自:http://www.littledai.com/20110408/112443/791

3gp video/3gpp
aab application/x-authoware-bin
aam application/x-authoware-map
aas application/x-authoware-seg
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
asd application/astound
asf video/x-ms-asf
asn application/astound
asp application/x-asap
asx video/x-ms-asf
au audio/basic
avb application/octet-stream
avi video/x-msvideo
awb audio/amr-wb
bcpio application/x-bcpio
bin application/octet-stream
bld application/bld
bld2 application/bld2
bmp image/bmp
bpk application/octet-stream
bz2 application/x-bzip2
cal image/x-cals
ccn application/x-cnc
cco application/x-cocoa
cdf application/x-netcdf
cgi magnus-internal/cgi
chat application/x-chat
class application/octet-stream
clp application/x-msclip
cmx application/x-cmx
co application/x-cult3d-object
cod image/cis-cod
cpio application/x-cpio
cpt application/mac-compactpro
crd application/x-mscardfile
csh application/x-csh
csm chemical/x-csml
csml chemical/x-csml
css text/css
cur application/octet-stream
dcm x-lml/x-evm
dcr application/x-director
dcx image/x-dcx
dhtml text/html
dir application/x-director
dll application/octet-stream
dmg application/octet-stream
dms application/octet-stream
doc application/msword
dot application/x-dot
dvi application/x-dvi
dwf drawing/x-dwf
dwg application/x-autocad
dxf application/x-autocad
dxr application/x-director
ebk application/x-expandedbook
emb chemical/x-embl-dl-nucleotide
embl chemical/x-embl-dl-nucleotide
eps application/postscript
eri image/x-eri
es audio/echospeech
esl audio/echospeech
etc application/x-earthtime
etx text/x-setext
evm x-lml/x-evm
evy application/x-envoy
exe application/octet-stream
fh4 image/x-freehand
fh5 image/x-freehand
fhc image/x-freehand
fif image/fif
fm application/x-maker
fpx image/x-fpx
fvi video/isivideo
gau chemical/x-gaussian-input
gca application/x-gca-compressed
gdb x-lml/x-gdb
gif image/gif
gps application/x-gps
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
hdm text/x-hdml
hdml text/x-hdml
hlp application/winhlp
hqx application/mac-binhex40
htm text/html
html text/html
hts text/html
ice x-conference/x-cooltalk
ico application/octet-stream
ief image/ief
ifm image/gif
ifs image/ifs
imy audio/melody
ins application/x-NET-Install
ips application/x-ipscript
ipx application/x-ipix
it audio/x-mod
itz audio/x-mod
ivr i-world/i-vrml
j2k image/j2k
jad text/vnd.sun.j2me.app-descriptor
jam application/x-jam
jar application/java-archive
jnlp application/x-java-jnlp-file
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpz image/jpeg
js application/x-javascript
jwc application/jwc
kjx application/x-kjx
lak x-lml/x-lak
latex application/x-latex
lcc application/fastman
lcl application/x-digitalloca
lcr application/x-digitalloca
lgh application/lgh
lha application/octet-stream
lml x-lml/x-lml
lmlpack x-lml/x-lmlpack
lsf video/x-ms-asf
lsx video/x-ms-asf
lzh application/x-lzh
m13 application/x-msmediaview
m14 application/x-msmediaview
m15 audio/x-mod
m3u audio/x-mpegurl
m3url audio/x-mpegurl
ma1 audio/ma1
ma2 audio/ma2
ma3 audio/ma3
ma5 audio/ma5
man application/x-troff-man
map magnus-internal/imagemap
mbd application/mbedlet
mct application/x-mascot
mdb application/x-msaccess
mdz audio/x-mod
me application/x-troff-me
mel text/x-vmel
mi application/x-mif
mid audio/midi
midi audio/midi
mif application/x-mif
mil image/x-cals
mio audio/x-mio
mmf application/x-skt-lbs
mng video/x-mng
mny application/x-msmoney
moc application/x-mocha
mocha application/x-mocha
mod audio/x-mod
mof application/x-yumekara
mol chemical/x-mdl-molfile
mop chemical/x-mopac-input
mov video/quicktime
movie video/x-sgi-movie
mp2 audio/x-mpeg
mp3 audio/x-mpeg
mp4 video/mp4
mpc application/vnd.mpohun.certificate
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpg4 video/mp4
mpga audio/mpeg
mpn application/vnd.mophun.application
mpp application/vnd.ms-project
mps application/x-mapserver
mrl text/x-mrml
mrm application/x-mrm
ms application/x-troff-ms
mts application/metastream
mtx application/metastream
mtz application/metastream
mzv application/metastream
nar application/zip
nbmp image/nbmp
nc application/x-netcdf
ndb x-lml/x-ndb
ndwn application/ndwn
nif application/x-nif
nmz application/x-scream
nokia-op-logo image/vnd.nok-oplogo-color
npx application/x-netfpx
nsnd audio/nsnd
nva application/x-neva1
oda application/oda
oom application/x-AtlasMate-Plugin
pac audio/x-pac
pae audio/x-epac
pan application/x-pan
pbm image/x-portable-bitmap
pcx image/x-pcx
pda image/x-pda
pdb chemical/x-pdb
pdf application/pdf
pfr application/font-tdpfr
pgm image/x-portable-graymap
pict image/x-pict
pm application/x-perl
pmd application/x-pmd
png image/png
pnm image/x-portable-anymap
pnz image/png
pot application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
pqf application/x-cprplayer
pqi application/cprplayer
prc application/x-prc
proxy application/x-ns-proxy-autoconfig
ps application/postscript
ptlk application/listenup
pub application/x-mspublisher
pvx video/x-pv-pvx
qcp audio/vnd.qcelp
qt video/quicktime
qti image/x-quicktime
qtif image/x-quicktime
r3t text/vnd.rn-realtext3d
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
rar application/x-rar-compressed
ras image/x-cmu-raster
rdf application/rdf+xml
rf image/vnd.rn-realflash
rgb image/x-rgb
rlf application/x-richlink
rm audio/x-pn-realaudio
rmf audio/x-rmf
rmm audio/x-pn-realaudio
rmvb audio/x-pn-realaudio
rnx application/vnd.rn-realplayer
roff application/x-troff
rp image/vnd.rn-realpix
rpm audio/x-pn-realaudio-plugin
rt text/vnd.rn-realtext
rte x-lml/x-gps
rtf application/rtf
rtg application/metastream
rtx text/richtext
rv video/vnd.rn-realvideo
rwc application/x-rogerwilco
s3m audio/x-mod
s3z audio/x-mod
sca application/x-supercard
scd application/x-msschedule
sdf application/e-score
sea application/x-stuffit
sgm text/x-sgml
sgml text/x-sgml
sh application/x-sh
shar application/x-shar
shtml magnus-internal/parsed-html
shw application/presentations
si6 image/si6
si7 image/vnd.stiwap.sis
si9 image/vnd.lgtwap.sis
sis application/vnd.symbian.install
sit application/x-stuffit
skd application/x-Koan
skm application/x-Koan
skp application/x-Koan
skt application/x-Koan
slc application/x-salsa
smd audio/x-smd
smi application/smil
smil application/smil
smp application/studiom
smz audio/x-smd
snd audio/basic
spc text/x-speech
spl application/futuresplash
spr application/x-sprite
sprite application/x-sprite
spt application/x-spt
src application/x-wais-source
stk application/hyperstudio
stm audio/x-mod
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
svf image/vnd
svg image/svg-xml
svh image/svh
svr x-world/x-svr
swf application/x-shockwave-flash
swfl application/x-shockwave-flash
t application/x-troff
tad application/octet-stream
talk text/x-speech
tar application/x-tar
taz application/x-tar
tbp application/x-timbuktu
tbt application/x-timbuktu
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-tar
thm application/vnd.eri.thm
tif image/tiff
tiff image/tiff
tki application/x-tkined
tkined application/x-tkined
toc application/toc
toy image/toy
tr application/x-troff
trk x-lml/x-gps
trm application/x-msterminal
tsi audio/tsplayer
tsp application/dsptype
tsv text/tab-separated-values
tsv text/tab-separated-values
ttf application/octet-stream
ttz application/t-time
txt text/plain
ult audio/x-mod
ustar application/x-ustar
uu application/x-uuencode
uue application/x-uuencode
vcd application/x-cdlink
vcf text/x-vcard
vdo video/vdo
vib audio/vib
viv video/vivo
vivo video/vivo
vmd application/vocaltec-media-desc
vmf application/vocaltec-media-file
vmi application/x-dreamcast-vms-info
vms application/x-dreamcast-vms
vox audio/voxware
vqe audio/x-twinvq-plugin
vqf audio/x-twinvq
vql audio/x-twinvq
vre x-world/x-vream
vrml x-world/x-vrml
vrt x-world/x-vrt
vrw x-world/x-vream
vts workbook/formulaone
wav audio/x-wav
wax audio/x-ms-wax
wbmp image/vnd.wap.wbmp
web application/vnd.xara
wi image/wavelet
wis application/x-InstallShield
wm video/x-ms-wm
wma audio/x-ms-wma
wmd application/x-ms-wmd
wmf application/x-msmetafile
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscriptc
wmlscript text/vnd.wap.wmlscript
wmv audio/x-ms-wmv
wmx video/x-ms-wmx
wmz application/x-ms-wmz
wpng image/x-up-wpng
wpt x-lml/x-gps
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
ws text/vnd.wap.wmlscript
wsc application/vnd.wap.wmlscriptc
wv video/wavelet
wvx video/x-ms-wvx
wxl application/x-wxl
x-gzip application/x-gzip
xar application/vnd.xara
xbm image/x-xbitmap
xdm application/x-xdma
xdma application/x-xdma
xdw application/vnd.fujixerox.docuworks
xht application/xhtml+xml
xhtm application/xhtml+xml
xhtml application/xhtml+xml
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xll application/x-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xm audio/x-mod
xml text/xml
xmz audio/x-mod
xpi application/x-xpinstall
xpm image/x-xpixmap
xsit text/xml
xsl text/xml
xul text/xul
xwd image/x-xwindowdump
xyz chemical/x-pdb
yz1 application/x-yz1
z application/x-compress
zac application/x-zaurus-zac
zip application/zip

posted @ 2011-08-10 23:16 newcj 阅读(1910) 评论(0) 编辑

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。


px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。


pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;


sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。


由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看

TextView

的源码可知 Android 默认使用 sp 作为字号单位。


在 Android 中,  1pt 大概等于 2.22sp


以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有 sp

的概念,则开发人员也可以通过适当的换算取近似值。


过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。


与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。


px(像素):屏幕上的点。


in(英寸):长度单位。


mm(毫米):长度单位。


pt(磅):1/72英寸。


dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。


dip:与dp相同,多用于android/ophone示例中。


sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。


为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图

posted @ 2011-07-29 13:57 newcj 阅读(210) 评论(0) 编辑

原文链接:http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html

      在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 

1. 不要阻塞UI线程 
2. 确保只在UI线程中访问Android UI工具包 
      当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。 
      比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员 。

android提供了几种在其他线程中访问UI线程的方法。 
Activity.runOnUiThread( Runnable ) 
View.post( Runnable ) 
View.postDelayed( Runnable, long ) 
Hanlder 
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。 

     为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。 
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。 
  Params 启动任务执行的输入参数,比如HTTP请求的URL。 
  Progress 后台任务执行的百分比。 
  Result 后台执行任务最终返回的结果,比如String。 

     AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 
  1) 子类化AsyncTask 
  2) 实现AsyncTask中定义的下面一个或几个方法 
     onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 
    doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 
    onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 
    onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 

为了正确的使用AsyncTask类,以下是几条必须遵守的准则: 
  1) Task的实例必须在UI thread中创建 
  2) execute方法必须在UI thread中调用 
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法 
  4) 该task只能被执行一次,否则多次调用时将会出现异常 
      doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。


从网上获取一个网页,在一个TextView中将其源代码显示出来

package test.list;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class NetworkActivity extends Activity{
    
private TextView message;
    
private Button open;
    
private EditText url;

    @Override
    
public void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       setContentView(R.layout.network);
       message
= (TextView) findViewById(R.id.message);
       url
= (EditText) findViewById(R.id.url);
       open
= (Button) findViewById(R.id.open);
       open.setOnClickListener(
new View.OnClickListener() {
           
public void onClick(View arg0) {
              connect();
           }
       });

    }

    
private void connect() {
        PageTask task 
= new PageTask(this);
        task.execute(url.getText().toString());
    }


    
class PageTask extends AsyncTask<String, Integer, String> {
        
// 可变长的输入参数,与AsyncTask.exucute()对应
        ProgressDialog pdialog;
        
public PageTask(Context context){
            pdialog 
= new ProgressDialog(context, 0);   
            pdialog.setButton(
"cancel"new DialogInterface.OnClickListener() {
             
public void onClick(DialogInterface dialog, int i) {
              dialog.cancel();
             }
            });
            pdialog.setOnCancelListener(
new DialogInterface.OnCancelListener() {
             
public void onCancel(DialogInterface dialog) {
              finish();
             }
            });
            pdialog.setCancelable(
true);
            pdialog.setMax(
100);
            pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pdialog.show();


        }
        @Override
        
protected String doInBackground(String... params) {

            
try{

               HttpClient client 
= new DefaultHttpClient();
               
// params[0]代表连接的url
               HttpGet get = new HttpGet(params[0]);
               HttpResponse response 
= client.execute(get);
               HttpEntity entity 
= response.getEntity();
               
long length = entity.getContentLength();
               InputStream is 
= entity.getContent();
               String s 
= null;
               
if(is != null) {
                   ByteArrayOutputStream baos 
= new ByteArrayOutputStream();

                   
byte[] buf = new byte[128];

                   
int ch = -1;

                   
int count = 0;

                   
while((ch = is.read(buf)) != -1) {

                      baos.write(buf, 
0, ch);

                      count 
+= ch;

                      
if(length > 0) {
                          
// 如果知道响应的长度,调用publishProgress()更新进度
                          publishProgress((int) ((count / (float) length) * 100));
                      }

                      
// 让线程休眠100ms
                      Thread.sleep(100);
                   }
                   s 
= new String(baos.toByteArray());              }
               
// 返回结果
               return s;
            } 
catch(Exception e) {
               e.printStackTrace();

            }

            
return null;

        }

        @Override
        
protected void onCancelled() {
            
super.onCancelled();
        }

        @Override
        
protected void onPostExecute(String result) {
            
// 返回HTML页面的内容
            message.setText(result);
            pdialog.dismiss(); 
        }

        @Override
        
protected void onPreExecute() {
            
// 任务启动,可以在这里显示一个对话框,这里简单处理
            message.setText(R.string.task_started);
        }

        @Override
        
protected void onProgressUpdate(Integer... values) {
            
// 更新进度
              System.out.println(""+values[0]);
              message.setText(
""+values[0]);
              pdialog.setProgress(values[
0]);
        }

     }

}


 

最后需要说明AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。

posted @ 2011-07-29 13:56 newcj 阅读(243) 评论(0) 编辑

以下内容转至知乎,原文:http://www.zhihu.com/question/19739907?__nids__=5363833,5358751,5355121,5365018,5363846,5359571&g=1

来自 Filestorm 的回答


===总结版===
*感谢各位朋友在评论中的指正。本贴旨在纠正各种明显的发音错误。如@梁海,@依云,@汤海所说,拿中文近似肯定会存在误差——对于这些误差,请直接参考音标或者真人发音。

()标相应英文单词
[]标音标

=====公司/产品名=====
Youtube [ju: tju:b] 念 优tiu啵 不念 优吐毙
Skype [ˈskaɪp] 念 死盖破 不念 死盖屁
Adobe [əˈdəʊbi] 念 阿兜笔 不念 阿斗伯
Chrome [krəʊm] 念 克肉姆
C# (C Sharp) 念 C煞破
GNU [(g)nuː] 念 哥怒
GUI [ˈɡui] 念 故意
JAVA [ˈdʒɑːvə] 念 扎蛙 不念 夹蛙
AJAX [ˈeɪdʒæks] 念 诶(ei)贾克斯 不念 阿贾克斯
Ubuntu [uˈbuntuː] 念 巫奔兔 不念 友邦兔
Debian [ˈdɛbiən] 念 得(dei)变
Linux [ˈlɪnəks] [ˈlɪnʊks] 两种发音 丽娜克斯 和 李扭克斯 都可以
LaTeX [ˈleɪtɛk]  [ˈleɪtɛx]  [ˈlɑːtɛx] [ˈlɑːtɛk] 雷泰克拉泰克 都可以 (根据Knuth的建议,雷泰克斯拉泰克斯不正确。而且LaTeX的重音是放在上。感谢@Rio讨论。另外感谢发音大牛@梁海刚刚指出, [ˈlɑːtɛx] 注音符号里的x发的不是克斯的音,而是接近“巴赫”的那个。)
GNOME [ɡˈnoʊm] [noʊm] 两种发音 格弄姆 弄姆 都可以

=====一般英语=====
null [nʌl] 念 
jpg [ˈdʒeɪpɛɡ] 念 zhei派个 不念 勾屁记
WiFi [ˈwaɪfaɪ] 念 歪fai
mobile [moˈbil] [ˈmoˌbil] [ˈməubail] 膜拜哦 和 牟bou 都可以
integer [ˈɪntɪdʒə] 念 音剃摺儿 不念 阴太阁儿
cache [kaʃ] 念 喀什 不念 卡尺
@ 念 at




=====感谢@Lawrence Li同学的补遗=====
Tumblr (Tumbler) 念 贪不勒
nginx (Engine X)念 恩静 爱克斯(@Lawrence Li有不同意见)
Apache [əˈpætʃiː] 念 阿趴气
Lucene [ˈluːsin] 念 鲁信
MySQL [maɪ ˌɛskjuːˈɛl] [maɪ ˈsiːkwəl] 念 买S奎儿 或 买吸扣 都可以
Exposé [ɛksˈpəʊzeɪ] 念 埃克斯剖Z (重音在Z上)
RFID 【本条争议颇大】:有人念af rid, ri fid,但是RFID官方念法依然是四个字母分开读R F I D
JSON (jason) 念 zhei森
Processing [ˈprəʊsesɪŋ] 重音在Pro上
avatar [ˈavətɑ] 念 艾瓦碳儿


来自 Lawrence Li 的回答


這個應該請以英語為第一語言的人來讀的,既然沒有,那麼我來獻醜好了。

YouTube, Skype, Tumblr, WordPress, nginx, null, xoom, Wi-Fi, Linux, Chrome, app, Ubuntu, Apache, GNU, Gnome, Lucene, Debian, Mobile, AJAX, MySQL, Adobe, C#, Exposé, RFID, JSON, Processing(指編程語言 Processing), Photoshop, avatar 的讀音分別是:

http://d.pr/F5B6

(經 @梁海 指正,我在上述錄音中的 Apache 讀音有誤。在技術領域,該詞讀作 uh-Patchy。)

還有一個,Håkon Wium Lie,Opera 現任 CTO。我不會讀,但 Opera 的人說 Lie 自己告訴英語世界的人說 Håkon 讀 how come 就沒錯了。他本人在 Opera 頁面的地址也是:

http://people.opera.com/howcome/

posted @ 2011-07-28 11:55 newcj 阅读(144) 评论(0) 编辑
摘要: 我所知道的原文链接:http://webservices.ctocio.com.cn/java/423/9092423.shtml本文介绍线程的7种状态及相互转换的方法。 今天有同事问到线程的问题,自己突然就有点蒙了,只模糊的记得个大概。 当初学习线程的时候把这7个状态记得比自己名字还熟悉 还把这7个状态编成了一段凄惨而美丽的爱情故事 没想到如今却只能记得个大概 真验证了“好记性不如烂笔头”的真理 还是赶快回忆一下吧 先从图片开始 小小的作下解释: 1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始状态; 2、阅读全文
posted @ 2011-07-21 14:17 newcj 阅读(171) 评论(0) 编辑
摘要: 将 C:\Windows\System32\drivers\etc\hosts 用记事本打开,然后添加以下文本#google plus203.208.46.146 picasaweb.google.com203.208.46.146 lh1.ggpht.com203.208.46.146 lh2.ggpht.com203.208.46.146 lh3.ggpht.com203.208.46.146 lh4.ggpht.com203.208.46.146 lh5.ggpht.com203.208.46.146 lh6.ggpht.com203.208.46.146 ssl.gstatic.com阅读全文
posted @ 2011-07-19 23:03 newcj 阅读(1070) 评论(0) 编辑
摘要: 在学习非阻塞 IO 的时候,打算把 Selector + 线程池 合在一起写个 Sample,结果在使用线程池处理 Selector 消息的时候,遇到了诸多问题。不过,经过不懈努力,最终还是解决了那些问题,现把问题总结如下:[1] Selector.select() 所在线程不停循环,当循环的上一次在线程池中没有处理完 selectedKeys, 则有可能在下一次也会 select 出来。如:上一次 OP_ACCEPT 在线程池中还没有到达 accept 的执行代码处,则循环的下一次,或者下下一次都会 select出相同的 OP_ACCEPT 消息。因此 每次循环应该等待线程池将所有消息处理.阅读全文
posted @ 2011-07-19 18:46 newcj 阅读(131) 评论(0) 编辑
摘要: 在Android开发的过程中,我们很有可能会使用到TabActivity来进行开发,而如果你的程序中需要针对TabActivity的TabHost中的每一个Activity绑定一个Service,通常我们的做法是在对应Tab页的Activity的onCreate()方法中进行bind操作,但是通过实践表明这个方法是无法达到绑定效果,在网上查了一下,发现在Google Android Issue中有这个缺陷,缺陷详细信息在这里(Google Android Issue 2483),三楼的oliver给出了正解Using getApplicationContext().bindService in阅读全文
posted @ 2011-06-08 22:44 newcj 阅读(447) 评论(0) 编辑