Piglet's Android starter Road Day 4-part 3
--handler message passing mechanism of Android event processing mechanism
------------ Reprint Please specify the source--coder-pig
Introduction to this section:
In the previous two sections, we have learned more about two kinds of event handling mechanisms: Listening and callback.
Seemingly completed the Android event processing mechanism, in fact, these two just happened to touch ah and the like to make the incident response;
And today this part is about modifying the UI component in the activity, some information is passed; I believe we all know that we can only
In the main thread to modify the UI components in the activity, but we need to periodically modify the UI components in a custom thread to
Value, we cannot modify the value of the UI component directly in the custom thread, so we can only send information to notify the main thread to update the UI component;
And this message of the east is what we are going to talk about today handler!
Learning Roadmap for this section
Body:
introduction of the handler class:
handler diagram of the execution process:
Flowchart Analysis:
Related nouns
UI Thread : Is our main thread, the system initializes a Looper object when creating the UI thread, and also creates a MessageQueue associated with it;
Handler: The function is to send and process information, if you want handler to work properly, there is a Looper object in the current thread
Message : Handler received and processed message object
MessageQueue : Message Queuing, FIFO management message, which creates a MessageQueue associated with the Looper object when it is initialized;
Looper : Each thread can only have one looper, manage MessageQueue, and constantly take out the message to the corresponding handler processing!
To put it simply:
When our child thread wants to modify the UI component in the activity, we can create a new handler object to send the message to the main thread through this object;
The information we send will be MessageQueue to the main thread, which is taken out in first-in, first-out order, and then based on the message object's
What attributes are distributed to the corresponding handler for processing!
related methods of handler:
void Handlemessage (Message msg) : The method of handling messages, usually used to be overridden!
sendemptymessage (int what) : Send an empty message
sendemptymessagedelayed (int what,long delaymillis) : Specifies how many milliseconds to delay sending empty information
sendMessage (Message msg) : Send Message now
sendmessagedealayeddelayed (Message msg) : Specify how many milliseconds to delay sending information
Final Boolean hasmessage (int what) : Checks whether Message Queuing contains a message with the What property is the specified value
if the parameter is (int what,object Object) : In addition to judging the What property, you also need to determine whether the object property is a message for the specified objects
examples of use of handler:
The use of handler is divided into the following two scenarios:
①handler written in the main thread
In the main thread, because the system has initialized a Looper object, so we directly create the handler object, you can send and process information!
code example:
A simple program to switch pictures regularly, through timer timer, modify the content of ImageView display, thus forming the animation
Main.xml
<relativelayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http// Schemas.android.com/tools " android:id=" @+id/relativelayout1 " android:layout_width=" Match_parent " android:layout_height= "Match_parent" android:gravity= "center" tools:context= " Com.jay.example.handlerdemo1.MainActivity "> <imageview android:id=" @+id/imgchange " Android : layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_alignparentleft= " True " android:layout_alignparenttop=" true "/></relativelayout>
Mainactivity.java
Package Com.jay.example.handlerdemo1;import Java.util.timer;import Java.util.timertask;import android.app.Activity ; Import Android.os.bundle;import android.os.handler;import android.os.message;import Android.widget.ImageView; public class Mainactivity extends Activity {//defines an array of switched pictures idint imgids[] = new Int[]{r.drawable.s_1,r.drawable.s_2, R.drawable.s_3,r.drawable.s_4,r.drawable.s_5,r.drawable.s_6,r.drawable.s_7,r.drawable.s_8};int Imgstart = 0;@ overrideprotected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate); Setcontentview ( R.layout.activity_main); final ImageView Imgchange = (ImageView) Findviewbyid (R.id.imgchange); final Handler MyHandler = New Handler () {@Override//Overrides the Handlemessage method, depending on what value in MSG determines whether to perform subsequent operations public void Handlemessage (Message msg) {if ( Msg.what = = 0x123) {imgchange.setimageresource (imgids[imgstart++% 8]);}}};/ /using timers, let handler send an empty message every 200 milliseconds to the new Timer (). Schedule (new TimerTask () {@Overridepublic void run () { Myhandler.sendemptymessage (0x123);}}, 0,200);}}
Run:
②handler written in a child thread
If handler is written in a sub-thread, we need to create a Looper object ourselves! The process is created as follows:
1) Call the Looper.prepare () method directly to create a Looper object for the current thread, and its constructor creates the matching MessageQueue;
2) Create a handler object and override the Handlemessage () method to handle information from other threads!
3) Call the Looper.loop () method to start the Looper
PS: There is no good example here, the author level is limited,
Only direct copy of Li Gang's crazy handout in the code, the code function is to enter a number, and finally through
Toast outputs all prime numbers within this range!
code example:
Main.xml
<linearlayoutxmlns:android= "Http://schemas.android.com/apk/res/android" android:layout_width= "Match_parent" android:layout_height= "match_parent" android:orientation= "vertical" ><edittext android:id= "@+id/etNum" android:inputtype= "number" android:layout_width= "match_parent" android:layout_height= "Wrap_content" Android: Hint= "Please enter the upper limit"/><buttonandroid:layout_width= "match_parent" android:layout_height= "Wrap_content" Android:o Nclick= "cal" android:text= "calculation"/></linearlayout>
Mainactivity.java:
Package Org.crazyit.handler;import Java.util.arraylist;import Java.util.list;import android.app.activity;import Android.os.bundle;import Android.os.handler;import Android.os.looper;import Android.os.message;import Android.view.view;import Android.widget.edittext;import Android.widget.toast;public class CalPrime extends Activity{ Static final String Upper_num = "UPPER"; EditText Etnum; Calthread calthread;//defines a thread class Calthread extends Thread{public Handler mhandler;public void Run () {Looper.prepare () ; mhandler = new Handler () {//define method for handling messages @overridepublic void Handlemessage (Message msg) {if (Msg.what = 0x123) {int upper = ms G.getdata (). GetInt (Upper_num); list<integer> nums = new arraylist<integer> ();//Calculates all prime numbers starting from 2 to upper outer:for (int i = 2; i <= upper; i++) {//With I at 2 starting, to the square root of I for all numbers for (int j = 2; J <= Math.sqrt (i); + j) {//if divisible, indicating that this number is not prime if (I! = 2 && I% J = = 0) {Co Ntinue outer;}} Nums.add (i);} Use Toast to show all prime number Toast.maketext (Calprime.this, nums.tostring (), ToaSt. Length_long). Show ();}}; Looper.loop ();}} @Overridepublic void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate); Setcontentview ( R.layout.main); etnum = (EditText) Findviewbyid (r.id.etnum); calthread = new Calthread ();//Start new thread Calthread.start ();} Provides event handlers for button click events public void Cal (View source) {//create message msg = new Message (); msg.what = 0x123; Bundle bundle = new bundle (); Bundle.putint (Upper_num, Integer.parseint (Etnum.gettext (). toString ())); Msg.setdata ( bundle);//Send Message CalThread.mHandler.sendMessage (msg) to the handler in the new Thread;}}
Use of the process has been said, we look at the code experience it!
When there are good examples, I will turn around and change!