【Andorid Studio】开发小记——AsyncTask

       AsyncTask是Android提供的用于异步消息处理的工具,可以使用它进行后台操作的同时,主界面上出现进度条来显示进度。

       使用方法比较简单,首先需要写一个类继承AsyncTask<Void,Intger,Boolean>,第一个参数是表示要传给后台的参数,如果不需要参数就Void即可,第二个参数是指定进度条的显示单位的数据类型,一般Integer整型即可,第三个参数则是执行之后的反馈结果。

       经常需要重写的几个办法有:

1、onPreExecute()

       这个方法会再后台的任务开始之前就调用,一般用于界面上的初始化,比如显示进度条对话框等等,可以先创建个progressDialog然后在这个方法中.show();

2、doInBackground()

        这个方法中写的具体代码都是在子线程中运行的,完成了里面的代码后线程会自动销毁,注意,子线程中是不能更新UI的(有一种特殊情况,假如在Activicy的onCreate()方法中新开一个子线程并且在子线程中对UI界面进行修改,是有可能成功的,只要在onCreate()的方法还未执行完成前,子线程也可以修改其界面,但非常不建议这么做,因为你无法确定onCreate()方法究竟在什么时候走完),如果想要更新UI界面,这里需要使用publishProgress()方法,这个方法调用了之后,下面的onProgressUpdate()就会得到执行,在里面写上具体的更新UI界面代码即可。

3、onProgressUpdate()

       当doInBackground()中调用了publishprogress()时候,就会执行这个方法下的代码,从名字可以看出,这个方法其实原本是用于更新进度条的显示进度的,而且一般来讲也都是这么使用的,但是因为他可以更新界面,所以你也可以利用它来做其他的修改。

4、onPostExecute()

       当后台的代码走完之后,就会将返回的结果作为参数进入这个方法中,你可以在这里进行一些UI的操作,比如说弹出窗口显示下载成功,将进度条隐藏等等。

       关于一开始继承AsyncTask的时候后面跟上的<Void,Integer,Boolean>,除了字面的解释,其实可以发现,当你写完这三个参数之后,重写doInBackgound()、onProgressUpdate()、onPostExecute()三个方法的时候,其输入输出参数也跟着改变了,比方说按照我们现在写好的<Void,Integer,Boolean>,输入参数为Void,那么doInBackground(Void... voids)表示输入参数为void,进度条的单位数据类型是integer,那么onProgressUpdate(Integer... values)接收的参数为integer,最后的boolean是返回值,可以看到boolean doInBackground(Void... voids)的返回值就是boolean,同时onPostExecute(Boolean b)输入参数正是boolean!可以看到Android Studio会根据你写的参数不同改变方法的输入输出参数。

       至于AsyncTask的使用,在Activity中new一个新的AsyncTask对象,使用.execute()方法(.execute()方法中要写入doInBackground参数),取消则是使用.cancel(true)。

       按照我现在浅显的理解,AsyncTask我认为像是一个已经封装好主线程回调的“子线程”,使用起来还是相当的方便的。作为不是那么方便的比较内容,下面提到一下如果不使用AsyncTask,直接开一个Thread,这时候怎么更新UI界面?答案是使用Handler,在主线程中新建一个Handler类,需要重写里面的handleMessage(Message msg)方法,在这个方法中对传入的参数进行分析,然后走相应的处理代码(用switch)。

       Message类是一个消息类,用几个属性:

1、what,是值,比方说有一个int变量名字为INTPARMA,值为1,这里的what你设置为1和INTPARMA都OK,都case得到(请不要吐槽这个,我原先以为是地址判断不是值的判断~。~);

2、arg1和arg2,这两个都是整型的,需要的话可以使用;

3、obj,这个属性比较有用,接受所有Object类型,所有变量都是基于Object的,当然,在handleMessage中接收的时候要记得转格式。

       在子线程中发送Message的方法也很简单,新建Message,设置好属性,调用myhandler.sendMessage()把Message作为参数,这样就发送出去了。也很简单,但是写Thread的话有时候会各种粗心(忘了写.start()等~。~),如果需要修改UI界面,还是建议使用AsyncTask。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值