Android handle学习笔记

jopen 11年前

public class MainActivity extends Activity {     private ProgressBar progressBar;   private Button button;     @Override   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    progressBar = (ProgressBar) findViewById(R.id.progressBar1);    button = (Button) findViewById(R.id.button1);    button.setOnClickListener(new OnClickListener() {       @Override     public void onClick(View arg0) {      progressBar.setVisibility(View.VISIBLE);      handle.post(run);      System.out.println("start...");     }    });   }     Handler handle = new Handler() {    @Override    public void handleMessage(Message msg) {     System.out.println("handle...");     progressBar.setProgress(msg.arg1);     handle.post(run);      }   };     Runnable run = new Runnable() {       int i = 0;             @Override    public void run() {     System.out.println(Thread.currentThread()+"---->"+i);     i=i+10;     Message message = handle.obtainMessage();     message.arg1 = i;          try {      Thread.sleep(1000);     } catch (InterruptedException e) {      // TODO Auto-generated catch block      e.printStackTrace();     }     if(i>100){      i=0;      handle.removeCallbacks(run);      //handle.sendMessage(message);     }     else{     handle.sendMessage(message);     }    }   };    }

Handler在android里负责发送和处理消息。它的主要用途有:
  1)按计划发送消息或执行某个Runnanble(使用POST方法);
  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新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)。