12-Android 中的多线程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void update(){ x++; y++; postInvalidate(); } public void run() { while(true){ update(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } }
– 维护一个消息列表,该列表中的消息通过Looper对象来分发. – 调用Looper.myQueue()方法可以获得一个MessageQueue对 象.
Android中的多线程
线程之间的通信
– 概念介绍
Handler
– 用来处理消息和线程 – 每个Handler实例关联一个单线程和该线程的一个消息队列 – Handler可以执行一个线程对象(Runnable实现)也可以发送和处理 Handler Runnable 消息 post(Runnable) postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message, long) sendMessageDelayed(Message, long) handleMessage(Message)
线程之间的通信
– 实例线程间通信
�
3G职业培训
Android 应用开发
Android 中的多线程
Android中的多线程
简介
– 在Android中组件(Activity,Service, BroadcastReceiver,ContentProvider)都运行在 主线程中,但是当我们遇到一些耗时的程序时需 要启动另外的线程来处理的. – 但对于Android平台来说其组件都没有设计成为线 程安全类型,所以需要引入一些同步的机制来使 其刷新,这点Google在设计Android时倒是参考了 下Win32的消息处理机制.
Android中的多线程
线程之间的通信
– 概念介绍
Looper
– 该类用来为一个线程维护一个消息队列 – 默认的线程是没有和一个Looper实例关联的,需要在线程中使 用Looper.prepare();关联一个线程,使用Looper.loop()处理消 息直到结束 – 详细见文档
Android中的多线程
Android中的多线程
AsyncTask
– AsyncTask 可以非常容易的来操作UI线程,该类可以在后 台完成一些操作,在UI线程中更新视图,并且无需操作 Thread和Handler.
详细内容见文档
– AsyncTask的执行过程
你可以使用泛型参数制定任务的参数,中间值(progress values) 和任何的最终执行结果 doInBackground()方法会自动地在工作者线程中执行 onPreExecute(),onPostExecute()和onProgressUpdate()方法会 在UI线程中被调用 doInBackground()方法的返回值会被传递给onPostExecute()方法 在doInBackground()方法中你可以调用publishProgress()方法,每 一次调用都会使UI线程执行一次onProgressUpdate()方法 你可以在任何时候任何线程中取消这个任务
Android中的多线程
刷新View类中的视图组件
– invalidate ()
必须在UI线程中调用,不能在非UI线程中调用
– postInvalidate ()
可以在非UI线程中调用
实例
– ThreadTest1
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint p = new Paint(); p.setColor(Color.RED); p.setStyle(Paint.Style.FILL); canvas.drawCircle(x, y, 20, p); x++; y++; invalidate(); }
Android中的多线程
class ChangeTask extends AsyncTask { @Override protected Object doInBackground(Object... arg0) { return arg0[0]; } @Override protected void onPostExecute(Object result) { tv.setText(result.toString()); } }
Android中的多线程
View.post( Runnable )
– 添加Runnable对象到消息队列,Runnable对象将 在UI线程中被执行.
class UpdateThread extends Thread{ @Override public void run() { tv.post(new Runnable(){ public void run() { tv.setText("changed"); } }); }
Android中的多线程
Hanlder
– 添加Runnable对象到消息队列,Runnable将运行 在和Handler关联的线程中.
Handler h = new Handler(); class UpdateThread extends Thread{ @Override public void run() { h.post( new Runnable(){ public void run() { tv.setText("changed"); } }); }
runOnUiThread
– 在UI线程里运行指定的动作,如果当前线程是UI 线程,该动作立刻被执行;如果当前线程是非UI 线程,该动作被发送到UI线程的事件队列中,等 待处理. class UpdateThread extends Thread{
@Override public void run() { runOnUiThread(new Runnable(){ @Override public void run() { tv.setText("changed"); } }); }
OnClickListener l = new OnClickListener() { @Override public void onClick(View v) { //new UpdateThread().start(); new ChangeTask().execute("abc"); } };
Android中的多线程
线程之间的通信
– 概念介绍
Message
– 定义一个信息对象,该信息对象可以发送给Handler对象来处 理. – 可以调用Message.obtain() 或者 Handler.obtainMessage() 方 法来实例化 – 详细信息见帮助文档
MessageQueue
Android中的多线程
非UI线程访问UI线程的方法
– Activity.runOnUiThread( Runnable ) – View.post( Runnable ) – View.postDelayed( Runnable, long ) – Hanlder – AsyncTask
Android中的多线程
ቤተ መጻሕፍቲ ባይዱ
Android中的多线程
View.postDelayed( Runnable, long )
– 添加Runnable对象到消息队列,并在指定时间之 后运行,Runnable对象将在UI线程中被执行.
class UpdateThread extends Thread{ @Override public void run() { tv. postDelayed (new Runnable(){ public void run() { tv.setText("changed"); } },1000); }
– 维护一个消息列表,该列表中的消息通过Looper对象来分发. – 调用Looper.myQueue()方法可以获得一个MessageQueue对 象.
Android中的多线程
线程之间的通信
– 概念介绍
Handler
– 用来处理消息和线程 – 每个Handler实例关联一个单线程和该线程的一个消息队列 – Handler可以执行一个线程对象(Runnable实现)也可以发送和处理 Handler Runnable 消息 post(Runnable) postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message, long) sendMessageDelayed(Message, long) handleMessage(Message)
线程之间的通信
– 实例线程间通信
�
3G职业培训
Android 应用开发
Android 中的多线程
Android中的多线程
简介
– 在Android中组件(Activity,Service, BroadcastReceiver,ContentProvider)都运行在 主线程中,但是当我们遇到一些耗时的程序时需 要启动另外的线程来处理的. – 但对于Android平台来说其组件都没有设计成为线 程安全类型,所以需要引入一些同步的机制来使 其刷新,这点Google在设计Android时倒是参考了 下Win32的消息处理机制.
Android中的多线程
线程之间的通信
– 概念介绍
Looper
– 该类用来为一个线程维护一个消息队列 – 默认的线程是没有和一个Looper实例关联的,需要在线程中使 用Looper.prepare();关联一个线程,使用Looper.loop()处理消 息直到结束 – 详细见文档
Android中的多线程
Android中的多线程
AsyncTask
– AsyncTask 可以非常容易的来操作UI线程,该类可以在后 台完成一些操作,在UI线程中更新视图,并且无需操作 Thread和Handler.
详细内容见文档
– AsyncTask的执行过程
你可以使用泛型参数制定任务的参数,中间值(progress values) 和任何的最终执行结果 doInBackground()方法会自动地在工作者线程中执行 onPreExecute(),onPostExecute()和onProgressUpdate()方法会 在UI线程中被调用 doInBackground()方法的返回值会被传递给onPostExecute()方法 在doInBackground()方法中你可以调用publishProgress()方法,每 一次调用都会使UI线程执行一次onProgressUpdate()方法 你可以在任何时候任何线程中取消这个任务
Android中的多线程
刷新View类中的视图组件
– invalidate ()
必须在UI线程中调用,不能在非UI线程中调用
– postInvalidate ()
可以在非UI线程中调用
实例
– ThreadTest1
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint p = new Paint(); p.setColor(Color.RED); p.setStyle(Paint.Style.FILL); canvas.drawCircle(x, y, 20, p); x++; y++; invalidate(); }
Android中的多线程
class ChangeTask extends AsyncTask { @Override protected Object doInBackground(Object... arg0) { return arg0[0]; } @Override protected void onPostExecute(Object result) { tv.setText(result.toString()); } }
Android中的多线程
View.post( Runnable )
– 添加Runnable对象到消息队列,Runnable对象将 在UI线程中被执行.
class UpdateThread extends Thread{ @Override public void run() { tv.post(new Runnable(){ public void run() { tv.setText("changed"); } }); }
Android中的多线程
Hanlder
– 添加Runnable对象到消息队列,Runnable将运行 在和Handler关联的线程中.
Handler h = new Handler(); class UpdateThread extends Thread{ @Override public void run() { h.post( new Runnable(){ public void run() { tv.setText("changed"); } }); }
runOnUiThread
– 在UI线程里运行指定的动作,如果当前线程是UI 线程,该动作立刻被执行;如果当前线程是非UI 线程,该动作被发送到UI线程的事件队列中,等 待处理. class UpdateThread extends Thread{
@Override public void run() { runOnUiThread(new Runnable(){ @Override public void run() { tv.setText("changed"); } }); }
OnClickListener l = new OnClickListener() { @Override public void onClick(View v) { //new UpdateThread().start(); new ChangeTask().execute("abc"); } };
Android中的多线程
线程之间的通信
– 概念介绍
Message
– 定义一个信息对象,该信息对象可以发送给Handler对象来处 理. – 可以调用Message.obtain() 或者 Handler.obtainMessage() 方 法来实例化 – 详细信息见帮助文档
MessageQueue
Android中的多线程
非UI线程访问UI线程的方法
– Activity.runOnUiThread( Runnable ) – View.post( Runnable ) – View.postDelayed( Runnable, long ) – Hanlder – AsyncTask
Android中的多线程
ቤተ መጻሕፍቲ ባይዱ
Android中的多线程
View.postDelayed( Runnable, long )
– 添加Runnable对象到消息队列,并在指定时间之 后运行,Runnable对象将在UI线程中被执行.
class UpdateThread extends Thread{ @Override public void run() { tv. postDelayed (new Runnable(){ public void run() { tv.setText("changed"); } },1000); }