今天在用Looper,Handler,Message进行线程间通信时遇到一个小问题,就是在调整好线程的执行顺序后子线程发送的消息目标线程并没有收到,代码:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Handler mHandler, mHandler1;
Thread t1;
Thread t2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 400) {
textView.setText("收到400");
} else {
textView.setText("收到0");
}
}
};
textView = (TextView) findViewById(R.id.text);
t1 = new Thread(runnable);
t2 = new Thread(runnable1);
t1.start();
}
Runnable runnable = new Runnable() {
@Override
public void run() {
Looper.prepare();
mHandler1 = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Message message = new Message();
message.what = msg.what;
mHandler.sendMessage(message);
}
};
t2.start();
}
};
Runnable runnable1 = new Runnable() {
@Override
public void run() {
Message message1 = new Message();
message1.what = 400;
mHandler1.sendMessage(message1);
}
};
}
主线程中创建mHandler
子线程1创建mHandler1 通过mHandler向主线程发送消息
子线程2通过mHandler1向子线程1发送消息。
子线程2向子线程1发送消息时,mHandler必须已经创建好了,所以在子线程1中调用t2.start();
但是程序运行起来并没有想要的结果,查看代码,网上搜了一下,原来是子线程1中并没有调用Looper.loop();这个方法,这个方法是做什么的呢,简单来说就是一直会从消息队列中取消息发送给Handler
主线程中 在ActivityThread的main方法中
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
SamplingProfilerIntegration.start();
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs.
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
// Set the reporter for event logging in libcore
EventLogger.setReporter(new EventLoggingReporter());
// Make sure TrustedCertificateStore looks in the right place for CA certificates
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
已经实现了Looper.prepareMainLooper();和Looper.loop();故不在需要自己实现