Handler整理

来源:互联网 发布:澳洲上市公司数据查询 编辑:程序博客网 时间:2024/06/16 05:33

一、handler的基础用法:在一个Runnable的实现类的run()方法中,发送Message消息(子线程),在Handler的实例的handleMessage中,判断相应的message并作出相应的处理(主线程)。

public class BounceView extends View{float x=40;public BounceView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);x+=10;Paint mPaint=new Paint();mPaint.setAntiAlias(true);mPaint.setColor(Color.GREEN);canvas.drawCircle(x, 40, 40, mPaint);}}
public class MainActivity extends Activity {protected static final int GUIUPDATEINDENTIFIER=0x101;Thread myRefreshThread=null;BounceView myBounceView=null;Handler myHandler=new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case MainActivity.GUIUPDATEINDENTIFIER:myBounceView.invalidate();//使窗口无效,意味着窗口需要重绘break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);this.myBounceView=new BounceView(this);this.setContentView(this.myBounceView);new Thread(new MyThread()).start();}class MyThread implements Runnable {@Overridepublic void run() {while(!Thread.currentThread().isInterrupted()){Message message=new Message();message.what=MainActivity.GUIUPDATEINDENTIFIER;MainActivity.this.myHandler.sendMessage(message);try {Thread.sleep(100);} catch (InterruptedException e) {}}}}}

二、利用handler.post()更新UI

myView=new MyView(this);mHandler=new Handler();//启动线程:第一种方法(仍是主线程)mHandler.post(new Runnable() {@Overridepublic void run() {System.out.println("1.run方法在执行。。。"+Thread.currentThread().getName());myView.invalidate();mHandler.postDelayed(this, 100); }});//启动线程:第二种方法(第一次是子线程,以后的递归调用仍是主线程)//new Thread(new Runnable() {//@Override//public void run() {//System.out.println("2.run方法在执行。。。"+Thread.currentThread().getName());//myView.invalidate();//mHandler.postDelayed(this, 100); //}//}).start();setContentView(myView);}
三、在线程里直接更新UI






0 0
原创粉丝点击