Android provides the Invalidate method for interface refresh, but invalidate cannot be called directly in the thread because he is violating the single-threaded model: Android UI operations are not thread-safe, and these operations must be called in the UI thread.
Invalidate () is used to refresh the view and must be working in the UI thread. For example, when you modify the display of a view, call invalidate () to see the redrawn interface. Invalidate () is called to pop the old view from the main UI thread queue. An Android program has only one process by default, but it can have a number of threads under one process.
In so many threads, the thread that is primarily responsible for controlling the display, update, and control interaction of the UI interface is called the UI thread, and since the OnCreate () method is executed by the UI thread, the UI thread can also be understood as the main thread. The rest of the threads can be understood as worker threads.
Invalidate () is mobilized in the UI thread and can be used by handler to notify the UI thread of interface updates through a worker thread.
and Postinvalidate () is called in the worker thread
using Invalidate () to refresh the interface
Instantiate an handler object and override the Handlemessage method call invalidate () to implement the interface refresh, while the thread updates the message through the SendMessage send interface.
To open a thread in OnCreate ()
New Thread (New Gamethread ()). Start ();
Instantiate a handler
Handler MyHandler = new Handler () {
Receive Message post processing
public void Handlemessage (Message msg) {
Switch (msg.what) {
Case Activity01.refresh:
Mgameview.invalidate (); Refresh Interface
Break
}
Super.handlemessage (msg);
}
};
Class Gamethread implements Runnable {
public void Run () {
while (! Thread.CurrentThread (). isinterrupted ()) {
Message message = new Message ();
Message.what = Activity01.refresh;
Send Message
Activity01.this.myHandler.sendMessage (message);
try {
Thread.Sleep (100);
} catch (Interruptedexception e) {
Thread.CurrentThread (). interrupt ();
}
}
}
}
use Postinvalidate () to refresh the interface
The use of postinvalidate is relatively simple, do not need to handler, directly in the thread call Postinvalidate.
Class Gamethread implements Runnable {
public void Run () {
while (! Thread.CurrentThread (). isinterrupted ()) {
try {
Thread.Sleep (100);
} catch (Interruptedexception e) {
Thread.CurrentThread (). interrupt ();
}
Use Postinvalidate to update the interface directly in the thread
Mgameview.postinvalidate ();
}
}
}
Android Postinvalidate () for UI Refresh