android主线程与子线程

创建子线程创建子线程

更多关于java线程的文章可以查看这两篇
线程1

创建线程的方法
在android中穿件子线程的方案很简单

创建子线程的几种方法
///////第一种///////
class Threadone extends Thread{
 @Override
 public void run() {} //重写run方法,这个方法就是子线程一旦启用就会执行的方法
}

new Threadone().start() //启动子线程

///////////第二种方式///////////
new Thread(){ 
 @Override
 public void run() {}
}.start()



解决子线程调用ui问题

在子线程中是无法调用ui
那么我们就绪要借助
runOnUiThread来操控主线程

runOnUiThread(()->{Toast.makeText(MAIN.this, "", Toast.LENGTH_SHORT).show();});
这样就可以在子线程里面调用了
但是这样还是有局限
例如我们无法向主线程传入子线程产生的变量
如图 如果我们想传递一个变量进去的话他就会提示我们必须用final来修饰 那么我们是无法传递变量的
image

这个时候我们就需要一个中间人来帮我们想主线程传递这个变量了



Handler对象传递消息

我们创建一个Handler的子类并重写handleMessage方法
这里先介绍一下消息对象 Message message = new Message();
这个message对象其实就是我们向主线程传递变量的载体

message.what = 1234
what属性是个int值 我们可以随便输入 这个值其实就是相当于message的身份或者说是id 因为如果有很多线程向主线程传递消息的时候 我们需要区分每个message的传入身份

message.obj = 任何对象
这个属性就是我们要传递的消息,他是Object类型所以等号的右边可以传入任何对象 String Intger 或者自定义的类对象都可以

Hundler的实例.sendMessage(message);发送消息到Handler的实例里面

那么什么是Hundler
个人理解修饰当Handler被实例化以后,主线程就会无时无刻监听这个对象,一旦有消息传来,就会被主线程调用,达到子线程间接操控主线程的作用或者向主线程传递消息的作用

下面看看代码

在子线程创建message
//创建一个消息对象来和主线程之间传递消息,因为主线程和子线程之间是无法直接通信的
                    Message message = new Message();

                    //what是个int数据,这个数字表明我们message对象的编号相当于身份信息
                    message.what = 0;

                    //obj就是我们要想主线程要传递的消息,他的类型为object类型,所以我们可以传递任意的对象过去,然后再强转回来
                    message.obj = resmessage;

                    //用Hundler对象来发送消息
                    myhundler.sendMessage(message);
创建喊Handler对象
private Handler myhundler = new Handler(Looper.myLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg); 
			//认证消息身份
            if (msg.what == 1234) {                //因为是object类型所以需要强转为Sstring
                Toast.makeText(uiMainActivity.this, (String) msg.obj, Toast.LENGTH_SHORT).show();
            }
        }
    };

posted @ 2024-06-09 22:24  WSssSW  阅读(54)  评论(0编辑  收藏  举报