Handler的实质就是异步消息处理。

实例一:

Handler的基本用法

XML布局代码:


<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tvResult"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="高兴点,未来不是梦"/><Buttonandroid:id="@+id/btnStart"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="动起来!"/><Buttonandroid:id="@+id/btnEnd"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="歇会吧!"/><Buttonandroid:id="@+id/btnClear"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="清零!"/></LinearLayout>




Java代码:


publicclassHandlerActivityextendsActivity{privateButtonbtnStart;privateButtonbtnEnd;privateButtonbtnClear;privateTextViewtvResult;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initContent();}privatevoidinitContent(){setContentView(R.layout.activity_handler);tvResult=(TextView)findViewById(R.id.tvResult);btnStart=(Button)findViewById(R.id.btnStart);btnEnd=(Button)findViewById(R.id.btnEnd);btnClear=(Button)findViewById(R.id.btnClear);btnStart.setOnClickListener(newStartButtonListener());btnEnd.setOnClickListener(newEndButtonListener());btnClear.setOnClickListener(newClearButtonListener());}//创建一个Handler对象Handlerhandler=newHandler();privateinti=0;//将要执行的操作写在线程对象的run方法当中RunnableupdateThread=newRunnable(){publicvoidrun(){System.out.println("高兴点,追梦!--"+i);tvResult.setText("高兴点,追梦!--"+i);i++;//在run方法内部,执行postDelayed或者是post方法handler.postDelayed(updateThread,3000);};};classStartButtonListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){//调用Handler的post方法,将要执行的线程对象添加到队列当中handler.post(updateThread);}}classEndButtonListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){//调用Handler的post方法,将要updateThread从队列当中移除handler.removeCallbacks(updateThread);}}classClearButtonListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){//调用Handler的post方法,将要updateThread从队列当中移除handler.removeCallbacks(updateThread);i=0;tvResult.setText("高兴点,未来不是梦");}}}




实例二:

Handler与ProgressBar的结合使用

XML布局代码:


<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ProgressBarandroid:id="@+id/progressbar"android:layout_width="200dp"android:layout_height="wrap_content"android:visibility="gone"/><Buttonandroid:id="@+id/btnStart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="前进吧,小摩托!"/></LinearLayout>




Java代码:


publicclassHandlerProgressBarActivityextendsActivity{privateProgressBarprogressbar;privateButtonbtnStart;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initContent();}privatevoidinitContent(){setContentView(R.layout.activity_handlerprogressbar);progressbar=(ProgressBar)findViewById(R.id.progressbar);btnStart=(Button)findViewById(R.id.btnStart);btnStart.setOnClickListener(newStartOnClick());}classStartOnClickimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){progressbar.setVisibility(View.VISIBLE);updateBarHandler.post(updateThread);}}HandlerupdateBarHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){progressbar.setProgress(msg.arg1);updateBarHandler.post(updateThread);}};RunnableupdateThread=newRunnable(){inti=0;@Overridepublicvoidrun(){System.out.println("BeginThread!"+i);i=i+10;Messagemsg=updateBarHandler.obtainMessage();msg.arg1=i;try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}updateBarHandler.sendMessage(msg);if(i==100){updateBarHandler.removeCallbacks(updateThread);}}};}




实例三:

Handler与线程的关系(一)

XML布局代码:


<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="前进吧,小摩托!"/></LinearLayout>


Java代码:



publicclassHandlerThreadActivityextendsActivity{privateHandlerhandler=newHandler();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initContent();}privatevoidinitContent(){handler.post(r);setContentView(R.layout.activity_handlerthread);System.out.println("activity--->"+Thread.currentThread().getId());System.out.println("activityname--->"+Thread.currentThread().getName());}Runnabler=newRunnable(){@Overridepublicvoidrun(){System.out.println("handler--->"+Thread.currentThread().getId());System.out.println("handlername--->"+Thread.currentThread().getName());try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}}};}


实例四:

Handler与线程的关系(二)

XML布局代码:

同【实例三】中的布局代码

Java代码:


publicclassHandlerThreadActivityextendsActivity{privateHandlerhandler=newHandler();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initContent();}privatevoidinitContent(){setContentView(R.layout.activity_handlerthread);Threadt=newThread(r);t.start();System.out.println("activity--->"+Thread.currentThread().getId());System.out.println("activityname--->"+Thread.currentThread().getName());}Runnabler=newRunnable(){@Overridepublicvoidrun(){System.out.println("handler--->"+Thread.currentThread().getId());System.out.println("handlername--->"+Thread.currentThread().getName());try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}}};}


实例五:

Handler实现真正的异步消息处理,在新线程中处理消息

XML布局代码:

同【实例三】中的布局代码


Java代码:


publicclassHandlerMsgActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initContent();}privatevoidinitContent(){setContentView(R.layout.activity_handlermsg);//打印当前线程System.out.println("activity---->"+Thread.currentThread().getId());//生成一个HandlerThread对象(具有循环处理消息的功能),实现了Looper来处理消息队列HandlerThreadhandlerThread=newHandlerThread("handler_thread");//让一个线程运行,必须用[线程名称].start()方法handlerThread.start();MyHandlermyHandler=newMyHandler(handlerThread.getLooper());Messagemsg=myHandler.obtainMessage();//将msg发动到目标对象,所谓目标对象,就是生成msg的handler对象msg.sendToTarget();}classMyHandlerextendsHandler{publicMyHandler(){}publicMyHandler(Looperlooper){super(looper);}@Override//每当向Handler发送一个msg的时候,就会执行handleMessage()方法publicvoidhandleMessage(Messagemsg){System.out.println("handler---->"+Thread.currentThread().getId());System.out.println("handlerMessage");}}}



实例六:

Handler实现真正的异步消息处理,在新线程中处理消息

XML布局代码:

同【实例三】中的布局代码


Java代码:

publicclassHandlerMsgActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initContent();}privatevoidinitContent(){setContentView(R.layout.activity_handlermsg);//打印当前线程System.out.println("activity---->"+Thread.currentThread().getId());//生成一个HandlerThread对象(具有循环处理消息的功能),实现了Looper来处理消息队列HandlerThreadhandlerThread=newHandlerThread("handler_thread");//让一个线程运行,必须用[线程名称].start()方法handlerThread.start();MyHandlermyHandler=newMyHandler(handlerThread.getLooper());Messagemsg=myHandler.obtainMessage();Bundleb=newBundle();b.putInt("age",20);b.putString("name","滔滔1024");msg.setData(b);//msg.arg1与msg.arg2的消耗比msg.setData()小,但只能传递整型变量//将msg发动到目标对象,所谓目标对象,就是生成msg的handler对象,本例中是发送到MyHandler对象中msg.sendToTarget();}classMyHandlerextendsHandler{publicMyHandler(){}publicMyHandler(Looperlooper){super(looper);}@Override//每当向Handler发送一个msg的时候,就会执行handleMessage()方法publicvoidhandleMessage(Messagemsg){Bundleb=msg.getData();intage=b.getInt("age");Stringname=b.getString("name");System.out.println("age->"+age+"\nname->"+name);System.out.println("handler---->"+Thread.currentThread().getId());System.out.println("handlerMessage");}}}