Multithreaded programming in Android: Conceptual analysis of Handler class, Runnable class, Thread class
1.Handler class:
Handler is a mechanism for Google encapsulation: it can be used to update the UI and send and process messages. Handler is run on the main thread (UI thread).
(2). Reasons for using the handler mechanism:
This is a Google package update UI mechanism and message mechanism, if you do not use this to update the UI and send processing messages when the exception will be thrown.
(3). Use of handler:
handler sends a message to itself actually. This means that it is sent and processed by itself. is because handler is associated with Looper.
A. Updating the UI interface:
PackageCom.chengdong.su.handlerdemo;Importandroid.app.Activity;ImportAndroid.app.ActionBar;ImportAndroid.app.Fragment;ImportAndroid.os.Bundle;ImportAndroid.os.Handler;ImportAndroid.os.Looper;ImportAndroid.view.LayoutInflater;ImportAndroid.view.Menu;ImportAndroid.view.MenuItem;ImportAndroid.view.View;ImportAndroid.view.ViewGroup;ImportAndroid.widget.ImageView;ImportAndroid.os.Build;/** * Handler use 1: Update the components in the UI interface * * @author SCD * */ Public class mainactivity extends Activity { PrivateImageView MView;/** Data Source * / Private int[] Mimage = {r.drawable.ic_1, r.drawable.ic_2, r.drawable.ic_3};/** where the picture is located * / Private intMindex =0;/** The object of the Handler * * PrivateHandler Mhandler =NewHandler ();/** The object of the Runnable * * PrivateMyrunnable mrunnable =NewMyrunnable (); Runnable Runnable =NewRunnable () {@Override Public void Run() {mindex++; Mindex = mindex%3; Mview.setimageresource (Mimage[mindex]);//Call the Runnable object again, call the run () method every secondMhandler.postdelayed (runnable, +); } };@Override protected void onCreate(Bundle savedinstancestate) {Super. OnCreate (Savedinstancestate); Setcontentview (R.layout.fragment_main); Init ();//Method One: //Mhandler.postdelayed (runnable, +); //Method Two: Custom Runnable objectMhandler.postdelayed (Mrunnable, +); }/*** * Init the view * * Private void Init() {MView = (ImageView) Findviewbyid (R.ID.IMAGEVIEW1); }/** * Mission: Business logic * * @author SCD * */ Private class myrunnable implements Runnable { @Override Public void Run() {mindex++; Mindex = mindex%3; Mview.setimageresource (Mimage[mindex]);//Call the Runnable object again, call the run () method every secondMhandler.postdelayed (Mrunnable, +); } }}
B. Message Processing:
PackageCom.chengdong.su.handlerdemo;Importandroid.app.Activity;ImportAndroid.os.Bundle;ImportAndroid.os.Handler;ImportAndroid.util.Log;ImportAndroid.widget.ImageView;/** * Handler use 1: Update the components in the UI interface * * @author SCD * */ Public class mainactivity extends Activity { PrivateString TAG ="Mainactivity";Private BooleanFlag;PrivateImageView MView;/** The object of the Handler * * PrivateHandler Mhandler =NewHandler () { Public void Handlemessage(Android.os.Message msg) {Switch(msg.what) { Case 0: {Mview.setimageresource (r.drawable.ic_1); LOG.D (TAG,"MSG 1"); Break; } Case 1: {Mview.setimageresource (r.drawable.ic_2); LOG.D (TAG,"MSG 2"); Break; }default: Break; } }; };@Override protected void onCreate(Bundle savedinstancestate) {Super. OnCreate (Savedinstancestate); Setcontentview (R.layout.fragment_main); Init ();if(Flag) {Mhandler.sendemptymessage (0); }Else{Mhandler.sendemptymessage (1); } }/*** * Init the view * * Private void Init() {MView = (ImageView) Findviewbyid (R.ID.IMAGEVIEW1); }}
2.Runnable class:
The Runnable class runs in the UI thread and does not create a new thread. The Runnable class is an interface that implements the business logic requirements by covering the run () method in the class. To update the components in the UI interface. The Runnable class is just a task interface. is an open thread that performs the task.
3.Thread class:
Implementing the Run () method in the Runnable class, the thread class calls the run () method to run the newly opened thread, and what the thread needs to do is done in the run () method.
(1). Start () Method: The method starts a thread. However, this thread is in a ready state and is not running. The run () method is then automatically called by the thread system class to complete the operation.
(2). Run () Method: The method becomes the thread body. Contains the contents of the thread to be executed. The run () method ends and this thread terminates.
PackageCom.chengdong.su.handlerdemo;Importandroid.app.Activity;ImportAndroid.app.ActionBar;ImportAndroid.app.Fragment;ImportAndroid.os.Bundle;ImportAndroid.os.Handler;ImportAndroid.os.Looper;ImportAndroid.util.Log;ImportAndroid.view.LayoutInflater;ImportAndroid.view.Menu;ImportAndroid.view.MenuItem;ImportAndroid.view.View;ImportAndroid.view.ViewGroup;ImportAndroid.widget.ImageView;ImportAndroid.widget.TextView;ImportAndroid.widget.Toast;ImportAndroid.os.Build;/** * * @author SCD * */ Public class secondactivity extends Activity { PrivateString TAG = GetClass (). Getsimplename ();PrivateTextView MView;PrivateMyThread Mthread;PrivateHandler Mhandler =NewHandler () { Public void Handlemessage(Android.os.Message msg) {LOG.D (TAG,"Thread UI:"+ Thread.CurrentThread (). GetId ()); Mview.settext ("111"); }; };@Override protected void onCreate(Bundle savedinstancestate) {Super. OnCreate (Savedinstancestate); Setcontentview (R.layout.activity_main); Init (); System.out.println ("--->ui thread:"+ Thread.CurrentThread (). GetId ());//Method One: NewThread () { Public void Run() {System.out. println ("---> New threads:"+ Thread.CurrentThread (). GetId ()); }; }.start ();//Method two: NewThread (NewRunnable () {@Override Public void Run() {System.out. println ("---> New threads:"+ Thread.CurrentThread (). GetId ()); }}). Start (); }Private void Init() {MView = (TextView) Findviewbyid (R.ID.TEXTVIEW1); } class MyThread extends Thread { PublicHandler MHandler2;@Override Public void Run() {//Create a message carrier objectLooper.prepare (); MHandler2 =NewHandler () { Public void Handlemessage(Android.os.Message msg) {Toast.maketext (Getapplicationcontext (),"111",1). Show (); }; };//Cycle mechanismLooper.loop (); } }}
Summary:
Runnable () is just a task abstraction, not multithreading. Thread.Start () is a new multi-threaded. and executes the thread on the newly opened thread, executing the Run () method. Multithreading is the thread implementation, and runnable is not much of a relationship. Thread is to better use the CPU, improve the program running rate!
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Multithreaded Programming in Android (i) attached source code