android 多线程
来源:互联网 发布:农村淘宝政策 编辑:程序博客网 时间:2024/05/01 23:07
当应用程序启动时,系统会为应用程序创建一个主线程(main)或者叫UI线程,它负责分发事件到不同的组件,包括绘画事件。完成应用程序与android UI控件之间的交互。单线程模型的性能是非常差的,除非所实现的应用程序相当的简单,特别是当所有的操作都在主线程中执行,比如访问网络或数据库之类的耗时操作将会导致用户界面锁定,所有的事件将不能分发,应用程序就像死了一样,更严重的是当超过5秒时,系统就会弹出“应用程序无响应”的对话框。所以如果需要执行耗时的操作,需要将该操作放到一个单独的后台线程中执行。
Handler:
Handler在android里负责发送和处理消息,主要用途有:
按计划发送消息或执行某个Runnanble(使用POST方法);
从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。
public class MyHandlerActivity extends Activity { Button button; MyHandler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlertest); button = (Button) findViewById(R.id.button); myHandler = new MyHandler(); // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据 // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象,(2): 让一个动作,在不同的线程中执行. // post(Runnable) // postAtTime(Runnable,long) // postDelayed(Runnable,long) // sendEmptyMessage(int) // sendMessage(Message); // sendMessageAtTime(Message,long) // sendMessageDelayed(Message,long) // 以上方法以 post开头的允许你处理Runnable对象 //sendMessage()允许你处理Message对象(Message里可以包含数据,) MyThread m = new MyThread(); new Thread(m).start(); } /** * 接受消息,处理消息 ,此Handler会与当前主线程一块运行 * */ class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper L) { super(L); } // 子类必须重写此方法,接受数据 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); // 此处可以更新UI Bundle b = msg.getData(); String color = b.getString("color"); MyHandlerActivity.this.button.append(color); } } // 线程执行耗时操作 class MyThread implements Runnable { public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Message msg = new Message(); Bundle b = new Bundle();// 存放数据 b.putString("color", "testcolor"); msg.setData(b); MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI } }}
- Android 多线程
- Android多线程
- Android 多线程
- Android 多线程
- Android 多线程
- Android多线程
- android 多线程
- android多线程
- android 多线程
- Android多线程
- android 多线程
- android多线程
- Android多线程
- android 多线程
- Android多线程
- Android 多线程
- android 多线程
- Android多线程
- Java中一个LinkedBlockingQueue源码的问题
- Android学习笔记: 第一天
- Linux下执行一些命令前加sudo时出现command not found的原因
- Linux下任务调度的crond常驻命令
- avd操作命令
- android 多线程
- CakePHP: Controller without View and Model
- 移植Busybox到宿主机
- 解决Windows 程序界面闪烁问题的一些经验
- 用C语言实现程序的多态性
- 上海少儿社保参保问题
- typedef
- Flash数学公式
- 数学书目