Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息
MainActivity例如以下:
- package cc.c;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.widget.TextView;
- /**
- * Demo描写叙述:
- *
- * 演示样例过程例如以下:
- * 1 子线程给子线程本身发送消息
- * 2 收到1的消息后,子线程给主线程发送消息
- * 3 收到2的消息后,主线程给子线程发送消息
- *
- * 为实现子线程给自己本身发送消息,关键还是在于构造Handler时传入的Looper.
- * 在此就传入该子线程自己的Looper即调用Looper.myLooper(),代码例如以下:
- * Looper.prepare();
- * mHandlerTest1=new HandlerTest1(Looper.myLooper());
- * Looper.loop();
- *
- * 所以当mHandlerTest1.sendMessage(message);发送消息时
- * 当然是发送到了它自己的消息队列.
- *
- * 当子线程中收到自己发送的消息后,可继续发送消息到主线程.此时仅仅要注意构造
- * Handler时传入的Handler是主线程的Handler就可以,即getMainLooper().
- * 其余没啥可说的.
- *
- *
- * 在主线程处理消息后再发消息到子线程
- *
- *
- * 事实上这些线程间发送消息,没有什么;关键还是在于构造Handler时传入谁的Looper.
- *
- */
- public class MainActivity extends Activity {
- private TextView mTextView;
- private HandlerTest1 mHandlerTest1;
- private HandlerTest2 mHandlerTest2;
- private int counter=0;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- init();
- }
- private void init() {
- mTextView = (TextView) findViewById(R.id.textView);
- //1 子线程发送消息给本身
- new Thread() {
- public void run() {
- Looper.prepare();
- mHandlerTest1=new HandlerTest1(Looper.myLooper());
- Message message = new Message();
- message.obj = "子线程发送的消息Hi~Hi";
- mHandlerTest1.sendMessage(message);
- Looper.loop();
- };
- }.start();
- }
- private class HandlerTest1 extends Handler {
- private HandlerTest1(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- System.out.println("子线程收到:" + msg.obj);
- //2 收到消息后可再发消息到主线程
- mHandlerTest2=new HandlerTest2(getMainLooper());
- Message message = new Message();
- message.obj = "O(∩_∩)O";
- mHandlerTest2.sendMessage(message);
- }
- }
- private class HandlerTest2 extends Handler {
- private HandlerTest2(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- mTextView.setText("在主线程中,收到子线程发来消息:" + msg.obj);
- //3 收到消息后再发消息到子线程
- if (counter==0) {
- Message message = new Message();
- message.obj = "主线程发送的消息Xi~Xi";
- mHandlerTest1.sendMessage(message);
- counter++;
- }
- }
- }
- }
main.xml例如以下:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <TextView
- android:id="@+id/textView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/hello_world"
- android:layout_centerInParent="true"
- android:layout_marginTop="70dip" />
- </RelativeLayout>
Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息的更多相关文章
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...
- Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息
之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...
- Handler主线程和子线程相通信
//创建主线程的handlerprivate Handler handler = new Handler(){ @Override public void handleMessage(Message ...
- 19 主线程向子线程发送信息(handler)
package com.fmy.handler; import android.app.Activity; import android.os.Bundle; import android.os.Ha ...
- Handler主线程子线程之间的互相通信
Handler主线程子线程之间的互相通信 package com.wyl.dansnote; import android.app.Activity; import android.os.Bundle ...
- Handler具体解释系列(七)——Activity.runOnUiThread()方法具体解释
MainActivity例如以下: package cc.testui3; import android.os.Bundle; import android.view.View; import and ...
- delphi 利用 InterlockedCompareExchange 实现主线程维一锁等待
在进行资源锁定时,一般是线程之间进行交互,很少需要在主线程也对资源进行锁定. 不过在一些复杂的业务中,存在子线程与主线程的交互,且一些资源也同步在主线程中使用时,主线程资源锁,就有存在的必要. 假定有 ...
- Handler系列之创建子线程Handler
上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...
随机推荐
- 通过javascript实现页面的横竖屏固定
javascript是不能固定页面是横屏还是竖屏的,但是我们可以通过另外一种思路来监听window.orientation状态,假设我们要固定页面为横屏显示,则当window.orientation返 ...
- Android中使用WebView与JS交互全解析
1.概述首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发.为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,An ...
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- codeforces 361 C - Mike and Chocolate Thieves
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Bad ...
- EFBaseDal
public class BaseDal<T> where T : class, new() { DataModelContainer db = new DataMod ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- RAC oracle删除数据库
24:site2-DMS1:~ # su - oracleoracle@site2-DMS1:~> sqlplus / as sysdba SQL*Plus: Release 11.2.0.3. ...
- bzoj AC 50 庆祝~~
No. 1050 Solved 50 Submit 212 AC 60 PE 6 WA 88 TLE 13 MLE 5 OLE 2 RE 29 CE 9 10001002100310041005 10 ...
- Contest20140711 loop 数论
loop|loop.in|loop.out 题目描述: 有N个点. 现在重复这样的操作: 随机找一个出度为0的点p1,随机找一个入度为0的点p2,连一条有向边从p1指向p2.直到没有出度为0的点. 统 ...
- [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】
题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...