Android 主线程与子线程的通信 By Handler and Message

//MainActivity.java

package com.example.multipleThread;

import com.example.sqlitedatabase.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

//主线程
public class MainActivity extends Activity {

	static int num = 0;
	static ChildThread myThread;
	
	 static Handler mainHandler = new Handler(){

                //接收到来自子线程的message时处理方法
		@Override
		public void handleMessage(Message msg) {
			tv.setText(msg.arg1+"");
			try {
				Thread.sleep(600);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			Message threadmsg = new Message();
	    	threadmsg.arg1 = ++num;
	    	myThread.threadHandler.sendMessage(threadmsg);
			super.handleMessage(msg);
		}
		
	};
	static TextView tv;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        tv = (TextView)findViewById(R.id.textView1);

        
    	
    	myThread = new ChildThread();
    	myThread.run();
    	
    	Message threadmsg = new Message();
    	threadmsg.arg1 = num;
    	myThread.threadHandler.sendMessage(threadmsg);
        
    }

}


ChildThread.Java

package com.example.multipleThread;

import android.database.sqlite.SQLiteOpenHelper;
import android.os.Handler;
import android.os.Message;

public class ChildThread extends Thread {

	static Handler threadHandler = new Handler(){

                <pre name="code" class="java">                //接收到来自主线程的message时处理方法
		@Override
		public void handleMessage(Message msg) {
			Message mainmsg = new Message();
			mainmsg.arg1 = msg.arg1*2;
			
			MainActivity.mainHandler.sendMessage(mainmsg);
			super.handleMessage(msg);
		}
		
	};
	
	SQLiteOpenHelper sqliteHelper;
	
	@Override
	public void run() {
		
		super.run();
	}
}

 

结论:handler对象是可以同时在主线程和子线程里创建的,并且可以建立正常的通信。

注意1:在线程类中创建的是静态的属性handler(当然也可以是非静态的),重点是该handler不是在run方法中创建!如果在run方法中创建的话,是需要先调用looper.prepare()方法的!

注意2在run()方法中new出来的才与本线程的looper挂钩(前提:该线程有looper),而在run()方法之外new出来的handler其实并没有与本线程挂钩。好像是绕了一个圈圈,到头来还是在主线程里创建了handler。

所以,第一个结论是片面的。那是很早之前浅陋的认识,希望没有对你造成误解。勿喷。感谢浏览!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值