Looper , Handler , Message异步消息传递
来源:互联网 发布:软件工程硕士 不统考 编辑:程序博客网 时间:2024/06/06 18:23
今天在用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();故不在需要自己实现
0 0
- Looper , Handler , Message异步消息传递
- 异步消息处理机制 Handler Looper Message
- Android异步消息之Looper、Handler、Message、HandlerThread的关系
- Android-异步消息处理机制(Handler,Looper,Message)
- Android异步消息的处理机制(looper handler message)
- 深入理解异步消息处理机制Message,handler,MessageQueue,looper
- Android异步消息处理之Looper,Handler,Message,MessageQueue
- Looper、Message、MessageQueue、Handler异步消息处理机制源码分析
- Android 异步消息处理机制:Looper、Handler、Message
- Android异步消息处理机制 Handler、Looper、Message
- Android 异步消息处理机制 深入理解 Looper、Handler、Message
- Android异步消息处理机制之Handler、Looper、Message
- Android异步消息处理机制 Looper、Handler、Message
- Android 异步消息机制(Looper、Handler、MessageQueue、Message关系)
- Android-异步消息处理机制1 -Handler,Looper,Message
- Android 异步消息机制 Handler Message Looper机制详解
- Android 异步消息处理机制之Handler、Message、Looper
- Android消息传递源码理解。Handler,Looper,MessageQueue,Message
- hdu1505 City Game
- Xen虚拟机克隆实战
- 小议jquery的remove()和detach()的方法区别
- C# 变量与子级变量
- android判断输入框EditText是否为空
- Looper , Handler , Message异步消息传递
- 2016.8~9月总结
- Codeforces Round #372 Complete The Graph
- 【非原创】使用instantclient使pl/sql连接远程oracle
- JZOJ4814. 【NOIP2016提高A组五校联考2】tree
- cxf和springmvc集成问题
- 关于测试Hibernate 报错SQL Error:1146,SQLState:42S02
- BNUOJ 52317 As Easy As possible
- 文章标题