一个Android应用程序被创建的时候都会创建一个UI主线程,但是有时我们会有一些比较耗时的操作,为了防止阻塞UI主线程,我们会将耗时的操作放到子线程中进行处理,处理完之后操作UI,但是Android不允许子线程操作UI,违背了Android单线程模型的原则(即Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行),所以Android通过Handler消息机制来实现线程之间的通讯。
Handler直接继承自Object,Handle对象可以处理Message或是Runnable对象。每个Handler对象独立拥有一个单独的线程,并关联一个消息线程,Handler对象可以把Message和Runnable对象压入消息队列或是从队列中销毁,也可以从消息队列中拿出消息进行处理。
Handler压入消息有两种方法:post和sendMessage
Post:
package com.example.threadapplication;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button postButton;
private Button postTimeButton;
private Button postDelayedButton;
private TextView textView;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
postButton = (Button)findViewById(R.id.button1);
postTimeButton = (Button)findViewById(R.id.button2);
postDelayedButton = (Button)findViewById(R.id.button3);
textView = (TextView)findViewById(R.id.TestView1);
postButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//textView.setText("使用post方法传递消息");
//该做法不可行,在子线程中无法修改UI线程中的控件
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("使用post方法传递消息");
}
});
}
}).start();
}
});
postTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
handler.postAtTime(new Runnable() {
@Override
public void run() {
textView.setText("使用postTime方法传递消息");
}
},3000);
}
}).start();
}
});
postDelayedButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
textView.setText("使用postDelayed方法传递消息,延迟3秒");
}
},3000);
}
}).start();
}
});
}
}
Message:
如果使用sendMessage方法传递消息,则需要构造一个Message对象。在构造Message对象时,不推荐直接使用其构造方法,而是使用Message.obtain()。
在Handler中需要重写其handleMessage方法
package com.example.threadapplication;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
* Created by 刘航伸 on 2017/5/26.
*/
public class MessageActivity extends AppCompatActivity {
private Button messageButton;
private TextView textView;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
textView.setText(msg.obj.toString());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.message_activity);
messageButton = (Button)findViewById(R.id.button1);
textView = (TextView)findViewById(R.id.textView);
messageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
Message message = Message.obtain();
message.obj = "sendMessage";
handler.sendMessage(message);
}
}).start();
}
});
}
}