android 多线程

来源:互联网 发布:农村淘宝政策 编辑:程序博客网 时间:2024/05/01 23:07
UI用户界面线程:

当应用程序启动时,系统会为应用程序创建一个主线程(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         }     }}