当前位置:  编程技术>移动开发
本页文章导读:
    ▪6410根文件系统的打造        6410根文件系统的制作 1.搭建开发环境     开发环境(主要指linux、虚拟机的安装和交叉编译环境的搭建)完全按照mini6410用户手册4.3节操作,在此不再赘述。 2.根文件系统的目录说明    .........
    ▪ Opensips-1.9.0环境装配        Opensips-1.9.0环境安装---------------------------------------------- 作者:         Amaryllis 时间:         2013-3-11 操作系统:  ubuntu-12.04-tls opensips:    Opensips-1.9.0-tls ---------------------------------------------.........
    ▪ 二月份工作总结       二月工作总结一. 使用eclipse与设备连接进行断点调试 2013-02-26 1)将Y:\[project_name]\development\ide\eclipse下的.classpath拷贝到Y:\[project_name]\下。 2)Eclipse启动,file->new->project,导入工程。 3)连.........

[1]6410根文件系统的打造
    来源: 互联网  发布时间: 2014-02-18
6410根文件系统的制作

1.搭建开发环境

    开发环境(主要指linux、虚拟机的安装和交叉编译环境的搭建)完全按照mini6410用户手册4.3节操作,在此不再赘述。

2.根文件系统的目录说明

    根文件系统是Linux启动的时候使用的第一个文件系统,没有它系统将无法正常的启动,然而在这个根文件系统中又包含了一系列的目录,接下来对这些目录做一个简单的介绍。

bin       存放所有用户都可以使用的、基本的命令。
sbin     存放的是基本的系统命令,它们用于启动系统、修复系统等。
Usr      里面存放的是共享、只读的程序和数据。
proc     这是个空目录,常作为proc 文件系统的挂载点。
dev      该目录存放设备文件和其它特殊文件。
etc       存放系统配置文件,包括启动文件。
lib        存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序
boot     引导加载程序使用的静态文件。
home   用户主目录,包括供服务账号锁使用的主目录,如FTP。
mnt      用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
opt      给主机额外安装软件所摆放的目录。
root      root 用户的主目录
tmp      存放临时文件,通常是空目录。
var       存放可变的数据,如日志等。

3 建立根文件系统的目录

进入到自己要放置文件系统的目录,采用《mini2440 Linux移植开发实战指南》,新根文件系统目录的脚本文件create_rootfs_bash,使用命令chmod +x create_rootfs_bash  ,改变文件的可执行权限,执行“./create_rootfs_bash ”运行脚本,就完成了根文件系统目录的创建。脚本create_rootfs_bash文件的内容为:

[cpp] view plaincopy
  • #!/bin/sh  
  • echo "------Create rootfs directons start...--------"  
  • mkdir rootfs  
  • cd rootfs  
  • echo "--------Create root,dev....----------"  
  • mkdir root dev etc boot tmp var sys proc lib usr mnt home  
  • mkdir etc/init.d etc/rc.d etc/sysconfig  
  • mkdir usr/sbin usr/bin usr/lib usr/modules  
  • echo "make node in dev/console dev/null"  
  • mknod -m 600 dev/console c 5 1  
  • mknod -m 600 dev/null c 1 3  
  • mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp  
  • mkdir var/lib var/lock var/run var/tmp  
  • chmod 1777 tmp  
  • chmod 1777 var/tmp  
  • echo "-------make direction done---------"  

  • 在脚本中改变了tmp 目录的使用权,让它开启sticky 位,为tmp 目录的使用权开启此位,可确保tmp 目录底下建立的文件,只有建立它的用户有权删除。尽管嵌入式系统多半是单用户,不过有些嵌入式应用不一定用root 的权限来执行,因此需要遵照根文件系统权限位的基本规定来设计。

    4.建立动态链接库(即lib目录)

    动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝lib的内容到新建的根文件目录lib内。

    [cpp] view plaincopy
  • cp -rfd /opt/FriendlyARM/mini6410/rootfs_qtopia_qt4 /opt/FriendlyARM/mini6410/rootfs/lib  

  • 6.交叉编译busybox(即根文件系统内bin,sbin等目录)

    Busybox 是一个遵循GPL v2 协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件。具体介绍可以参考韦东山完全手册的346页。
       (1)、解压busybox
             cd /opt/FriendlyARM
             tar –zxvf busybox-1.17.2-20101120.tgz  
        (2)、进入源码,修改Makefile 文件:(这个地方是很重要的一步,必须做,有的教程或者文章参考内核的配置与编译,即在make menuconfig和make后面添加ARCH、CROSS_COMPILE等,而对此不做修改,将可能会导致“request_module: runaway   loop modprobe binfmt-464c”等错误出现)
          cd /opt/studyarm/busybox-1.17.2
          修改:
          CROSS_COMPILE ?=arm-linux- //第164 行
          ARCH ?=arm //第189 行
       (3)、配置busybox
         提示:友善之臂已经在光盘中提供了busybox 的源代码包,在光盘\linux 目录中,busybox-1.17.2-20101120.tgz解压后里面包含了友善之臂提供的缺省配置文件:fa_config     (输入命令“cp fa.config .config”可以调用该配置),一般用户直接使用缺省文件就可以了,这样生成的busybox 和root_qtopia_qt4 中的是完全一致的。但为了对它的配置了解       更多一些,可以参考 《mini2440 Linux移植开发实战指南》 的如下步骤:

        输入 make menuconfig进行配置

        下面的配置和busybox1.17.2的配置基本一样,部分地方不太一样。

    [cpp] view plaincopy
  • Busybox Settings--->  
  •   
  •              General Configuration--->  
  •   
  •                             [*] Show verbose applet usage messages //这个是现实程序的详细信息吧  
  •   
  •                             [*] Store applet usage messages in compressed form  
  •   
  •                             [*] Support –install [-s] to install applet links at runtime  
  •   
  •                             [*] Enable locale support(system needs locale for this to work)  
  •   
  •                             [*] Support for –long-options  
  •   
  •                             [*] Use the devpts filesystem for unix98 PTYs  
  •   
  •                             [*] Support writing pidfiles  
  •   
  •                             [*] Runtime SUID/SGID configuration via /etc/busybox.config  
  •   
  •                             [*]  Suppress warning message if /etc/busybox.conf is not readable//这个配置是如果/etc/busybox.conf is是不可读的话则会给用户提示警告信息  
  •   
  • Build Options--->//我主要关注这个就是编译选项  
  •   
  •                             [*] Build BusyBox as a static binary(no shared libs) //静态链接,如果你要使用静态链接库的话那么这个选项一定要选上了 一定<这里的话随意反正我用动态库>  
  •   
  •                             [*] Build with Large File Support(for accessing files>2GB)  
  •   
  • Installation Options->//安装配置  
  •   
  •                             [*]Don’t use /usr                     //选上它防止把编译进系统中的/usr下以便破坏宿主系统  
  •   
  •                             Applets links (as soft-links) --->  //安装配置 使用软链接  
  •   
  •                                    (./_install) BusyBox installation prefix  
  •   
  • Busybox Library Tuning ---> //调用那些库呢?这个真不知道怎么解释。。。  
  •   
  •                             (6)Minimum password legth  
  •   
  •                             (2)MD5:Trade Bytes for Speed  
  •   
  •                             [*]Fsater /proc scanning code(+100bytes)  
  •   
  •                             [*]Command line editing  
  •   
  •                             (1024)Maximum length of input  
  •   
  •                             [*]   vi-style line editing commands  
  •   
  •                             (15) History size  
  •   
  •                             [*]   History saving  
  •   
  •                             [*]   Tab completion  
  •   
  •                             [*]Fancy shell prompts  
  •   
  •                             (4) Copy buffer size ,in kilobytes        
  •   
  • [*]Use ioctl names rather than hex values in error messages  
  •   
  • [*]Support infiniband HW  
  • [cpp] view plaincopy
  • Linux Module Utilities--->          //这个就是lib/modules的设置  
  •   
  •                     (/lib/modules)Default directory containing modules //默认内核模块安装到该目录下  
  •   
  •                      (modules.dep)Default name of modules.dep  
  •   
  • [*]   insmod           //这些都是支持的命令  
  •   
  • [*]   rmmod  
  •   
  • [*]   lsmod  
  •   
  • [*]   modprobe  
  •   
  • -----options common to multiple modutils   
  •   
  • [ ] support version 2.2/2.4 Linux kernels  
  •   
  • [*]Support tainted module checking with new kernels  
  •   
  • [*]Support for module .aliases file  
  •   
  • [*] support for modules.symbols file  
  • 5.dev设备文件的制作

     设备文件较多,而且比较繁杂,因此其制作一般包括两个部分:静态创建设备文件和使用mdev创建设备文件

     (1).静态创建设备文件

      其实在刚开始制作文件系统的目录里已经静态制作创建了两个必须的设备的设备文件:console和null,内核在引导时这两个设备节点必须存在。

    [cpp] view plaincopy
  • mknod -m 600 dev/console  c 5 1  
  • mknod -m 600 dev/null     c 1 3  
  •  (2).用mdev创建设备文件

       udev:它是个用户程序,能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建、删除等。它的操作相对复杂,但灵活性很高。

       mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动     程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。在busybox的配置中,下面的选项将增加对mdev的支持。

    [cpp] view plaincopy
  • Linux System Utilities  --->                
  •   
  •            [*]Support /etc/mdev.conf          
  •   
  •            [*]Support command execution at device addition/removal  
  • 6.编译、安装busybox

    在6,7两步的配置结束后,就可以编译并安装busybox。

    编译:make ARCH=arm CROSS_COMPILE=arm-linux,其实仅执行make即可,我在这里添加了ARCH和CROSS_COMPILE,其实没什么作用,只是为了保险。因为如果编译的不是ARM版的busybox,系统时无法运行的。

    安装:make install CONFIG_PREFIX=/opt/FriendlyARM/mini6410/rootfs/。CONFIG_PREFIX中安装的位置也可以在配置的时候设置,具体位置为:

    [cpp] view plaincopy
  • Busybox Settings->  
  •     Installation Options->  
  •         (/***/***)Busybox Installation Prefix  
  • 7.编译、安装内核模块。

     在第5步中,安装动态链接库后,lib/modules目录下已经有内核模块了,但是这个内核模块和我采用的内核不是一个版本,因此重新编译安装。

    进入内核的目录,在编译安装内核模块之前必须保证内核已经正确无误的配置及编译过一次。在这里假设还没有编译过。

    (1)我们要使得Linux-2.6.38的缺省目标平台成为ARM 的平台。
    修改总目录下的Makefile

    [cpp] view plaincopy
  • export KBUILD_BUILDHOST := $(SUBARCH)  
  • ARCH ?= $(SUBARCH)  
  • CROSS_COMPILE ?=  
  • 改为
    [cpp] view plaincopy
  • export KBUILD_BUILDHOST := $(SUBARCH)  
  • ARCH ?= arm  
  • CROSS_COMPILE ?= arm-linux-  
  • 其中,ARCH 是指定目标平台为arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。

    (2)配置、编译内核模块

    在此不具体说明怎么配置,可以将内核里友善自带的配置文件拷贝。然后执行:

    [cpp] view plaincopy
  • make menuconfig  
  • make zImage  
  • (3)编译内核模块

    [cpp] view plaincopy
  • make modules ARCH=arm CROSS_COMPILE=arm-linux-  
  • (4)安装内核模块
    [cpp] view plaincopy
  • make modules_install ARCH=arm INSTALL_MOD_PATH=/opt/FriendlyARM/mini6410/rootfs  
  • 8.建立etc目录下的配置文件<这些配置信息都是一些基本不需要改动的东西所以直接从主机或者友善自带文件系统拷贝>
    a、新建etc/mdev.conf文件,内容为空。
    b、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。
    c、etc/sysconfig目录下新建文件HOSTNAME,内容写自己喜欢的名字。
    d、etc/inittab文件:
    [cpp] view plaincopy
  • #etc/inittab  
  • ::sysinit:/etc/init.d/rcS  
  • ::askfirst:-/bin/sh  
  • ::ctrlaltdel:/sbin/reboot  
  • ::shutdown:/bin/umount -a –r  
  • e、etc/init.d/rcS文件:
    [cpp] view plaincopy
  • #!/bin/sh  
  • PATH=/sbin:/bin:/usr/sbin:/usr/bin  
  • runlevel=S  
  • prevlevel=N  
  • umask 022  
  •   
  • export PATH runlevel prevlevel  
  •   
  • echo "----------munt all----------------"  
  • mount -a  
  • echo /sbin/mdev>/proc/sys/kernel/hotplug  
  • mdev -s  
  •   
  • echo "***********************************************  
  • echo "****************Studying ARM*********************"  
  • echo "Kernel version:linux-2.6.38"  
  • echo "Student"  
  • echo "Date:2012.05.08"  
  • echo "***********************************************"  
  •   
  • /bin/hostname -F /etc/sysconfig/HOSTNAME  
  • 使用以下命令改变rcS的执行权限:
    [cpp] view plaincopy
  • Chmod +x rcS  
  • f、etc/fstab文件:
    [cpp] view plaincopy
  • #device    mount-point     type     option     dump   fsck   order  
  • proc          /proc        proc     defaults    0        0  
  • none          /tmp        ramfs    defaults    0        0  
  • sysfs         /sys          sysfs    defaults    0        0  
  • mdev          /dev        ramfs    defaults    0        0  
  • g、 etc/profile文件:
    [cpp] view plaincopy
  • #Ash profile  
  • #vim:syntax=sh  
  • #No core file by defaults  
  • #ulimit -S -c 0>/dev/null 2>&1  
  • USER="id -un"  
  • LOGNAME=$USER  
  • PS1='[\u@\h=W]#'  
  • PATH=$PATH  
  • HOSTNAME='/bin/hostname'  
  • export USER LOGNAME PS1 PATH  
  • 到此,根文件系统的构建就完成了,下面将其制作成ubi镜像文件并烧写。

    9.制作根文件系统镜像
    执行以下命令:

    [cpp] view plaincopy
  • tar zxvf mktools-20110720.tar.gz -C /  
  • 注意:C为大写,C后面有个空格,C是改变解压安装目录的意思。
    这将会在/usr/sbin目录下创建生成相应的工具集

    然后执行

    [cpp] view plaincopy
  • mkubimage-slc rootfs rootfs.ubi  
  • 将ubi镜像文件烧写至开发板运行即可。



        
    [2] Opensips-1.9.0环境装配
        来源: 互联网  发布时间: 2014-02-18
    Opensips-1.9.0环境安装
    ----------------------------------------------
    作者:         Amaryllis
    时间:         2013-3-11
    操作系统:  ubuntu-12.04-tls
    opensips:    Opensips-1.9.0-tls
    ---------------------------------------------
    环境安装总步骤:
    一.操作系统安装(略)
    二.opensips下载
        用svn down下代码 svn co https://opensips.svn.sourceforge.net/svnroot/opensips/branches/1.9 opensips_1_9
    三.mysql安装
        见 http://blog.csdn.net/ximen1224/article/details/8457222
    四.opensips安装
        提示: 1.安装时最好使用ROOT角色,因为需要用到sudo的地方比较多,很多命令都需要sudo。如果习惯在命令前添加sudo的开发者可以忽略此提示。
                    2.上下按键:指针向上、向下;左右键:返回上层目录、进入下层目录,一直按左键可返回到命令输入界面,之后返回图形界面输入:fg;CTRL-Z:退出到命令界面
        1.进入opensips目录
            root@ubuntu:cd /home/amaryllis/work/project/opensips/
            root@ubuntu:make menuconfig
            输入上述命令进入选择框模式如图:
            
            如图:往下执行
            
            
            选择mysql数据库模块
            
        
            制定安装目录
            
            如上图:红色部分为指针选择,蓝色部分为指定程序安装目录
            提示:程序安装目录最好指定到公共文件目录中,据测试放到用户目录中,启动会出问题,个人出现过BUG,故作此提示
            
            配置完成之后需要对配置进行保存,如下图
            
            下面会提示“db_mysql”模块存在问题,表示您需要安装apt-get install libmysqlclient-dev

        安装完之后进入到图形界面进行安装,如下图
        

            安装界面如下:
            
            出现上图内容部分表示安装已经成功完成,可以进行下一步:配置。
            提示:如果出现下列内容则恭喜你,你中奖了:
                mysql/mysql.h:没有那个文件或目录。这时候就需要安装apt-get install libmysqlclient-dev来解决这个问题。
    五:opensips文件配置:

            1.9相对于1.7及以下版本配置起来要麻烦一点,但是配置完给人的感觉还是比上述版本要安全、简介一点。
            1.修改配置文件opensipsctlrc
               root@ubuntu:gedit  /usr/local/opensips_proxy/etc/opensips/opensipsctlrc
               提示: 如果您对vim非常熟的话就用VIM吧。这个没有要求。本文修改配置文件采取gedit方式。
                修改内容如下:
                    ## your SIP domain
                    SIP_DOMAIN=192.168.99.103
                    # this parameter.
                    DBENGINE=MYSQL
                    ## database host
                    DBHOST=localhost
                    ## database name (for ORACLE this is TNS name)
                    DBNAME=opensips
                    ## database read/write user
                    DBRWUSER=opensips
                    ## password for database read/write user
                    DBRWPW="opensipsrw"
                    ## database super user (for ORACLE this is 'scheme-creator' user)
                    DBROOTUSER="root"
            2.安装数据库
                 root@ubuntu:cd  /usr/local/opensips_proxy/sbin/
                 root@ubuntu:./opensipsdbctl create
                接下来就是创建数据库如下图:
                
        3.检查M4是否安装
                apt-get install m4,如果没有安装,那么你懂的。。。
        4.生成opensips_residential_2013-3-10_22:52:46.cfg文件
                root@ubuntu:cd  /usr/local/opensips_proxy/sbin/
                root@ubuntu:./osipconfig
                输入上述命令进入图形界面,如下图:
                

                

                

                选中下列项,如图
                

                
                上图指针提示项为根据上述选择生成配置文件。

                接下来就是修改该文件了,如上图,根据下面的目录找到该文件:
                 root@ubuntu:cd  /usr/local/opensips_proxy/etc/opensips/
                 root@ubuntu:gedit opensips_residential_2013-3-10_22:52:46.cfg
                打开之后就开始修改属性了,需要修改的点如下图:
                
                修改TCP与UDP建立信令链接的地址,修改成你ubuntu所在机器上的IP地址,查看命令:ifconfig
                
                设置模块的位置,需要用绝对路径来指定,具体位置砍图片内容制动的路径。
                如果你需要打印日志到单独的文件中以方便管理的话,需要修改下列属性:
                log_facility = LOG_LOCAL0修改为 log_facility = LOG_LOCAL1
                然后
                root@ubuntu:gedit /etc/rsylog.conf
                在最后面添加代码local1.*   -/var/log/opensips.log
                最后重启日志
                 root@ubuntu:/etc/init.d/rsyslog restart
                日志即配置完成。
                接下来回到原来的配置文件上来:
                #### URI module
                loadmodule "uri.so"
                modparam("uri", "use_uri_table", 0)
                modparam("uri", "db_url",
            "mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME
                
                在此处添加红色代码部分,否则运行时会报错。
                到此该配置文件基本上告一段落了。
        
            5.设置启动项:
                root@ubuntu:cd  /home/amaryllis/work/project/opensips/packaging/debian
                root@ubuntu:cp opensips.init /etc/init.d/opensips
                root@ubuntu:chmod +x /etc/init.d/opensips
                root@ubuntu:gedit /etc/init.d/opensips
                打开最后修改配置文件如下图:
                

                
                红色部分为需要删除的部分

                
                "-f ..."为程序程序制定生成时候的配置文件,只有这里指定了,在启动时才能通过该路径去读取该配置文件。否则不读取该配置文件。
            6.设置默认项opensips.default
                 root@ubuntu:cd  /home/amaryllis/work/project/opensips/packaging/debian  
                 root@ubuntu:cp  opensips.default /etc/default/
                 root@ubuntu:cd  /etc/default/
                 root@ubuntu:mv  opensips.default opensips
                 root@ubuntu:gedit opensips
                打开之后修改配置文件如下图:
                
    六:启动opensips
                root@ubuntu:/etc/init.d/opensips restart(重启)
                或者
                root@ubuntu:/etc/init.d/opensips start(启动)
    七:查看进程:
                root@ubuntu:ps aux | grep opensips
        
                结果如下图:
                    
                查看UDP链接状态
                      
                查看TCP链接状态
                        
                如果出现结果和上述不一样,那么只能说你配置出问题了,需要仔细进行排查。
                     至此安装基本上告一段落了,剩下的就是需要你去测试看能否通过了。

        
    [3] 二月份工作总结
        来源: 互联网  发布时间: 2014-02-18
    二月工作总结
    一. 使用eclipse与设备连接进行断点调试 2013-02-26

    1)将Y:\[project_name]\development\ide\eclipse下的.classpath拷贝到Y:\[project_name]\下。

    2)Eclipse启动,file->new->project,导入工程。

    3)连接设备,打开DDMS,在device列表中的进程选中你要调试的进程。

    4)设置debug。如下图。

    Project选择调试项目。

    Port选择远程端口,这里是8700。

    最后按debug。

    出现如下绿色标记,代表设置成功。

    具体端口视具体情况而定。

    5)在代码中打上断点,其他操作如同调试java一般程序那样。

    1. AsyncTask介绍与应用 2013-02-25

           

    转载自:http://blog.csdn.net/bd_zengxinxin/article/details/8504696

            先大概认识下Android.os.AsyncTask类:

           * android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。

           * AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
       * Params 启动任务执行的输入参数,比如HTTP请求的URL。
       * Progress 后台任务执行的百分比。
        * Result 后台执行任务最终返回的结果,比如String,Integer等。

           * AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。

       * 1) 继承AsyncTask
        * 2) 实现AsyncTask中定义的下面一个或几个方法
           * onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
           * doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
          * onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
          * onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.

          * onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。

    为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

          1) Task的实例必须在UI 线程中创建

          2) execute方法必须在UI 线程中调用

          3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。

          4) 该task只能被执行一次,否则多次调用时将会出现异常

          doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

    下面通过一个Demo来说明如何使用Android.os.AsyncTask类,通过进度条来显示进行的进度,然后用TextView来显示进度值。程序结构图如下:

    [1] \layout\main.xml 布局文件源码如下:

    [html] view plaincopy

    1 <?xml version="1.0" encoding="utf-8"?>  

    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    3     android:orientation="vertical"  

    4     android:layout_width="fill_parent"  

    5     android:layout_height="fill_parent"  

    6     >  

    7     <TextView    

    8        android:layout_width="fill_parent"   

    9        android:layout_height="wrap_content"   

    10        android:text="Hello , Welcome to Andy's Blog!"/>  

    11     <Button  

    12        android:id="@+id/download"  

    13        android:layout_width="fill_parent"  

    14        android:layout_height="wrap_content"  

    15        android:text="Download"/>  

    16     <TextView    

    17        android:id="@+id/tv"  

    18        android:layout_width="fill_parent"   

    19        android:layout_height="wrap_content"   

    20        android:text="当前进度显示"/>  

    21     <ProgressBar  

    22        android:id="@+id/pb"  

    23        android:layout_width="fill_parent"  

    24        android:layout_height="wrap_content"  

    25        />  

    26 </LinearLayout>  


     [2] /src中的MainActivity.java源码如下:

    [html] view plaincopy

    27 package com.andyidea.demo;  

    28   

    29 import android.app.Activity;  

    30 import android.os.AsyncTask;  

    31 import android.os.Bundle;  

    32 import android.view.View;  

    33 import android.widget.Button;  

    34 import android.widget.ProgressBar;  

    35 import android.widget.TextView;  

    36   

    37 public class MainActivity extends Activity {  

    38           

    39     Button download;  

    40     ProgressBar pb;  

    41     TextView tv;  

    42       

    43     /** Called when the activity is first created. */  

    44     @Override  

    45     public void onCreate(Bundle savedInstanceState) {  

    46         super.onCreate(savedInstanceState);  

    47         setContentView(R.layout.main);  

    48         pb=(ProgressBar)findViewById(R.id.pb);  

    49         tv=(TextView)findViewById(R.id.tv);  

    50           

    51         download = (Button)findViewById(R.id.download);  

    52         download.setOnClickListener(new View.OnClickListener() {  

    53             @Override  

    54             public void onClick(View v) {  

    55                 DownloadTask dTask = new DownloadTask();  

    56                 dTask.execute(100);  

    57             }  

    58         });  

    59     }  

    60       

    61     class DownloadTask extends AsyncTask<Integer, Integer, String>{  

    62         //后面尖括号内分别是参数(例子里是线程休息时间),进度(publishProgress用到),返回值 类型  

    63           

    64         @Override  

    65         protected void onPreExecute() {  

    66             //第一个执行方法  

    67             super.onPreExecute();  

    68         }  

    69           

    70         @Override  

    71         protected String doInBackground(Integer... params) {  

    72             //第二个执行方法,onPreExecute()执行完后执行  

    73             for(int i=0;i<=100;i++){  

    74                 pb.setProgress(i);  

    75                 publishProgress(i);  

    76                 try {  

    77                     Thread.sleep(params[0]);  

    78                 } catch (InterruptedException e) {  

    79                     e.printStackTrace();  

    80                 }  

    81             }  

    82             return "执行完毕";  

    83         }  

    84   

    85         @Override  

    86         protected void onProgressUpdate(Integer... progress) {  

    87             //这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数  

    88             //但是这里取到的是一个数组,所以要用progesss[0]来取值  

    89             //第n个参数就用progress[n]来取值  

    90             tv.setText(progress[0]+"%");  

    91             super.onProgressUpdate(progress);  

    92         }  

    93   

    94         @Override  

    95         protected void onPostExecute(String result) {  

    96             //doInBackground返回时触发,换句话说,就是doInBackground执行完后触发  

    97             //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"  

    98             setTitle(result);  

    99             super.onPostExecute(result);  

    100         }  

    101           

    102     }  

    103 }  


    [3] 下面看下程序的运行结果截图:

     

     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3