Handler是开发人员在面试过程中最常见的问题之一了,这篇文章将较为全面地对Handler进行解读,包括源码层,以及使用方法。
如果看完文章有疑问,欢迎在评论中一起探讨
基本内容包括:
看完文章之后,可以用这个图片进行复习。
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
private String[] str = new String[]{"傲慢","偏见","僵尸"};
private int index = 0;
MyRunnable myRunnable = new MyRunnable();
private class MyRunnable implements Runnable{
@Override
public void run() {
index = index % 3;
mTextView.setText(str[index]);
index ++;
mHandler.postDelayed(myRunnable,1000);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
mHandler.postDelayed(myRunnable,1000);
}
}
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
mTextView.setText(msg.obj+""+ "arg1="+msg.arg1 + " arg2="+msg.arg2);
super.handleMessage(msg);
}
};
private class Person{
String name;
int age;
@Override
public String toString() {
return "name="+name+" age="+age;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
Message msg = new Message();
msg.arg1 = 1;
msg.arg2 = 2;
Person person = new Person();
person.name = "pig";
person.age = 10;
msg.obj = person;
mHandler.sendMessage(msg);
}
}.start();
}
}
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
mTextView.setText(msg.obj+""+ "arg1="+msg.arg1 + " arg2="+msg.arg2);
super.handleMessage(msg);
}
};
private class Person{
String name;
int age;
@Override
public String toString() {
return "name="+name+" age="+age;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
Message msg = mHandler.obtainMessage();//同样可以获取Message对象
msg.arg1 = 1;
msg.arg2 = 2;
Person person = new Person();
person.name = "pig";
person.age = 10;
msg.obj = person;
msg.sendToTarget();
}
}.start();
}
}public class MainActivity extends AppCompatActivity {
private TextView mTextView;
Handler mHandler = new Handler(new Handler.Callback() {
//传入CallBack对象,对于重载的返回值为bollean的handleMessage()
//返回值为false,将先执行这个方法,再执行返回值为void的handleMessage()方法
//返回值为true,只执行这个方法
@Override
public boolean handleMessage(Message msg) {
Toast.makeText(MainActivity.this, "截获消息", Toast.LENGTH_SHORT).show();
return false;
}
}){
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, "发出消息", Toast.LENGTH_SHORT).show();
}
};
private class Person{
String name;
int age;
@Override
public String toString() {
return "name="+name+" age="+age;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.sendEmptyMessage(0);
}
});
}
}
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
// Make sure the identity of this thread is that of the local process,
// and keep track of what that identity token actually is.
Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
// This must be in a local variable, in case a UI event sets the logger
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
// Make sure that during the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}
msg.recycleUnchecked();
}
}public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}public class MainActivity extends AppCompatActivity {
private TextView mTextView;
public Handler mHandler = new Handler(){//主线程中的Handler
@Override
public void handleMessage(Message msg) {
Log.d("CurrentThread",Thread.currentThread()+"");//打印Thread 的ID
}
};
class MyThread extends Thread{
private Handler handler;//子线程中的Handler
@Override
public void run() {
Looper.prepare();//获取Looper
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.d("CurrentThread",Thread.currentThread()+"");
}
};
Looper.loop();//轮询消息队列
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyThread thread= new MyThread();
thread.start();
try {
thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.handler.sendEmptyMessage(1);
mHandler.sendEmptyMessage(1);
}
}public class MainActivity extends AppCompatActivity {
private TextView mTextView;
public HandlerThread mHandlerThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandlerThread = new HandlerThread("handler thread");
mHandlerThread.start();
Handler handler = new Handler(mHandlerThread.getLooper()){//通过getLooper()获取Looper
@Override
public void handleMessage(Message msg) {
Log.d("current thread","" + Thread.currentThread());
}
};
handler.sendEmptyMessage(1);
}
}public class MainActivity extends AppCompatActivity {
public Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.d("current thread", "" + Thread.currentThread());
Message message = new Message();
message.what = 1;
handler.sendMessageDelayed(message,1000);//向子线程的Handler发送消息
}
};
public HandlerThread mHandlerThread;
public Handler handler;
private Button btn1,btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn);
btn2 = (Button) findViewById(R.id.btn2);
mHandlerThread = new HandlerThread("handler thread");//指定HandlerThread的名字
mHandlerThread.start();
handler = new Handler(mHandlerThread.getLooper()){//通过getLooper()获取Looper
@Override
public void handleMessage(Message msg) {
Log.d("current thread", "" + Thread.currentThread());
Message message = new Message();
mHandler.sendMessageDelayed(message,1000);//向主线程中的Handler发送消息
}
};
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.sendEmptyMessage(1);//开始发送消息
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.removeMessages(1);//停止发送消息
}
});
}
}public class MainActivity extends AppCompatActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText("更新UI");
}
});
}
}.start();
}
}public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}public class MainActivity extends AppCompatActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTextView.post(new Runnable() {
@Override
public void run() {
mTextView.setText("更新UI");
}
});
}
}.start();
}
}
public boolean post(Runnable action) {
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
// Assume that post will succeed later
ViewRootImpl.getRunQueue().post(action);
return true;
}public class MainActivity extends AppCompatActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
mTextView.setText("更新UI了");
}
}.start();
}
}结果:
public class MainActivity extends AppCompatActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTextView.setText("更新UI了");
}
}.start();
}
}
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
原文:http://blog.csdn.net/chen_lian_/article/details/51031331