执行一条耗时操作,需放在子线程里运行
1、线程的基本用法
新建类继承 或实现接口 ,重写方法--(可直接内部类)
● class MyThread extends Thread { ~run () { //处理具体的逻辑 } }
new MyThread( ).start ( ) ; // 使用则 new一个实例即可
● class MyThread implements Runnable { ..}
MyThread runnable= new Runnable ( ); //生成一个Runnable对象
new Thread( runnable) .start( ); //Thread 构造函数接收Runnable 对象
● new Thread( new Runnable ( ){....} ).start( ) ;
2、在子线程中更新UI
不能直接在线程汇总更新UI (不安全) 使用异步消息处理机制 ,在子线程对 UI操作(传递消息)
..... public static final int UPDATE_TEXT=1 ;
private Handler handler= new Handler ( ) {
~handleMessage( Message msg ) {
swith( msg.what) {
case UPDATE_TEXT:
text_textView.setText( " .....设置修改文本内容 " ); //在这里进行UI操作
......
.....onClick( ){ //点击事件 为要对UI操作的对象 ,用消息发出去
swith( ....) {
case .... :
new Thread( new Runnable ( ) { ...run ( ) {
Message message=new Message( ) ;
message.what=UPDATE_TEXT;
handler.sendMessage( message ); //将Message发出去
...).start( ) ;
由4部分组成:Message 、Handler 、MessageQueue 、Looper
1、Message :消息
在线程之间传递的消息,可以在内部携带少量的信息,用于在不用的线程之间交换数据。
2、Handler :处理者
发送和处理消息 。发送sendMessage()传送到handleMessage()
3、MessageQueue :消息队列
存放所有通过Handler发送的消息 ,每个线程只有一个
4、Looper------MQ(消息队列)的管家
调用Looper的loop(),进入无线循环,每当发现MQ中存在一条 消息就会将它取出,传递到Handler的handleMessage()中,每一 个线程只有一个Looper对象
在主线程创建Handler对象——>重写handleMessage()——>子线程中传递消息
1、使用AsyncTask
抽象类,继承时可指定三个泛型参数:
⑴ Params---执行AsyncTask 时需输入,可用于在后台任务中使用
⑵ Progress---后台任务执行时,若需要在前端显示进度,可作为进度单位
⑶ Result---任务执行完闭,若需返回结果,可作为返回类型
eg: class DownloadTask extends AsyncTask< Void ,Integer ,Boolean > { .... } //重写 方法,完成对任务的定制
可实现的方法:
⑴ onPreExecute( )---在后台任务开始执行前调用,用于进行一些界面上的初始化操作,如进度条对话框显示
⑵ doInBackground( Params ....)---所有代码都在子线程中运行,在这里去处理所有耗时任务。任务完成通过return 将结果返回。不可尽心UI操作
⑶ onProgressUpdate( ... )----当在后台任务中调用了 publishProgress ()后,此方法会很快被调用 ,方法携带的参数就是在后台任务中传递过来。可对UI进行操作,利用参数中的数值可对界面中元素更新
⑷ onPostExecute( Result )--- doInBackground( Params ....)方法后,次方法很快被调用,返回的数据会作为参数传递到此方法中,可利用
onProgressUpdate( ... )方法进行一些UI操作
●在 doInBackground( Params ....) 中进行具体的耗时任务
●在 onProgressUpdate( ... ) 进行UI操作
●在 onPostExecute( Result ) 执行一些任务的收尾工作
启动任务: new DownloadTask( ).execute( ) ;