Android中的Handler

Handler机制(二)——Message池和其他小问题(待更新) Message创建的时候除了new Message()之外,还有两种方式首先看第一个,是通过Handler对象来调用获取Message对象。可以看到obtainMessage()方法有多个重载,除了空参外,还可以传入一些参数,这些参数都是初始化Message对象使用的,是Message类中的属性。无一例外,他们都是调用的Message中的obtain方法,只是根据传入参数个数的不同,调用的是obtain方法的多个重载方法。 阅读详情

1、主线程给自己发送Message

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Looper looper = Looper.getMainLooper(); // 主线程的Looper对象,Looper looper2 = Looper.myLooper(); // looper == looper2
                // 这里以主线程的Looper对象创建了handler,
                // 所以,这个handler发送的Message会被传递给主线程的MessageQueue。
                mHandler = new LocalHandler(looper);
                mHandler.removeMessages(0);

                // 构建Message对象
                // 第一个参数:是自己指定的message代号,方便在handler选择性地接收
                // 第二三个参数没有什么意义
                // 第四个参数需要封装的对象
                Message msg = mHandler.obtainMessage(1, 2, 3, "主线程发消息了");

                mHandler.sendMessage(msg); // 发送消息
            }
        });
    }

    class LocalHandler extends Handler {

        public LocalHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    }
}

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                mHandler.obtainMessage(1, "主线程发消息了").sendToTarget();
            }
        });
    }
}

2、其他线程给主线程发送Message

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 可以看出这里启动了一个线程来操作消息的封装和发送的工作
                // 这样原来主线程的发送就变成了其他线程的发送,简单吧?呵呵
                new LocalThread().start();
            }
        });
    }

    // 加了一个线程类
    class LocalThread extends Thread {

        @Override
        public void run() {
            Looper looper = Looper.getMainLooper(); // 主线程的Looper对象,// Looper looper2 = Looper.myLooper(); // looper2 == null
            // 这里以主线程的Looper对象创建了handler,
            // 所以,这个handler发送的Message会被传递给主线程的MessageQueue。
            mHandler = new LocalHandler(looper);

            // 构建Message对象
            // 第一个参数:是自己指定的message代号,方便在handler选择性地接收
            // 第二三个参数没有什么意义
            // 第四个参数需要封装的对象
            Message msg = mHandler.obtainMessage(1, 2, 3, "其他线程发消息了");

            mHandler.sendMessage(msg); // 发送消息
        }
    }

    class LocalHandler extends Handler {

        public LocalHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    }
}

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private final Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                new LocalThread().start();
            }
        });
    }

    // 加了一个线程类
    class LocalThread extends Thread {

        @Override
        public void run() {
            mHandler.obtainMessage(1, "其他线程发消息了").sendToTarget();
        }
    }
}

3、主线程给其他线程发送Message

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;
    private Handler mMainHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

                // 启动线程
        new MyThread().start();

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 这里handler的实例化在线程中
                // 线程启动的时候就已经实例化了
                Message msg = mThreadHandler.obtainMessage(1, "主线程发送的消息");
                mThreadHandler.sendMessage(msg);
            }
        });
    }

    class MyHandler extends Handler {

        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
        }
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象,用于接收消息

            // 注意了:这里的handler是定义在主线程中的哦,呵呵,
            // 前面看到直接使用了handler对象,是不是在找,在什么地方实例化的呢?
            // 现在看到了吧???呵呵,开始的时候实例化不了,因为该线程的Looper对象
            // 还不存在呢。现在可以实例化了
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            mThreadHandler = new ThreadHandler(Looper.myLooper());


            // 这个方法,有疑惑吗?
            // 其实就是一个循环,循环从MessageQueue中取消息。
            // 不经常去看看,你怎么知道你有新消息呢???
            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {
            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                mMainHandler = new MyHandler(Looper.getMainLooper());
                Message msg2 = mMainHandler.obtainMessage(1, 1, 1, "子线程收到:" + (String) msg.obj);
                mMainHandler.sendMessage(msg2);
            }
        }
    }
}
public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;

    private final Handler mMainHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 11:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        // 启动线程
        new MyThread().start();

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 这里handler的实例化在线程中,不知道何时创建成功,所以在使用前先判断下,否则可能crash
                if (mThreadHandler != null) {
                    mThreadHandler.obtainMessage(1, "主线程发送的消息").sendToTarget();
                }
            }
        });
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象,用于接收消息

            // 注意了:这里的handler是定义在主线程中的哦,呵呵,
            // 前面看到直接使用了handler对象,是不是在找,在什么地方实例化的呢?
            // 现在看到了吧???呵呵,开始的时候实例化不了,因为该线程的Looper对象还不存在呢。现在可以实例化了
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            mThreadHandler = new ThreadHandler(Looper.myLooper());

            // 这个方法,有疑惑吗?
            // 其实就是一个循环,循环从MessageQueue中取消息。
            // 不经常去看看,你怎么知道你有新消息呢???
            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {

            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                switch (msg.what) {
                    case 1:
                        Log.d("gg", (String) msg.obj + msg.what);
                        mMainHandler.obtainMessage(11, "子线程收到:" + (String) msg.obj).sendToTarget();
                        break;
                }

            }
        }
    }
}
// 09-02 16:30:10.658: D/gg(7800): 主线程发送的消息1
// 09-02 16:30:10.658: D/gg(7800): 子线程收到:主线程发送的消息11
public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;

    private final Handler mMainHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 11:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mText.setText("我是主线程的Handler,收到了消息:" + (String) msg.obj);
                    break;
            }
        }
    };

    // 定义线程类中的消息处理类
    class ThreadHandler extends Handler {

        public ThreadHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            // 这里对该线程中的MessageQueue中的Message进行处理
            // 这里我们再返回给主线程一个消息
            switch (msg.what) {
                case 1:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mMainHandler.obtainMessage(11, "子线程收到:" + (String) msg.obj).sendToTarget();
                    break;
            }
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        HandlerThread handlerThread = new HandlerThread("xiancheng");
        handlerThread.start();
        mThreadHandler = new ThreadHandler(handlerThread.getLooper());

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 这里handler的实例化在线程中,不知道何时创建成功,所以在使用前先判断下,否则可能crash
                if (mThreadHandler != null) {
                    mThreadHandler.obtainMessage(1, "主线程发送的消息").sendToTarget();
                }
            }
        });
    }
}

4、其他线程给自己发送Message 

public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mThreadHandler;
    private Handler mMainHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // 启动线程
                new MyThread().start();
            }
        });
    }

    class MyHandler extends Handler {

        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            mText.setText((String) msg.obj);
        }
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            mThreadHandler = new ThreadHandler(Looper.myLooper());
            Message msg = mThreadHandler.obtainMessage(1, "我自己");
            mThreadHandler.sendMessage(msg);

            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {

            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                // 加入判断看看是不是该线程自己发的信息
                if (msg.what == 1) {
                    mMainHandler = new MyHandler(Looper.getMainLooper());
                    Message msg2 = mMainHandler.obtainMessage(1, "禀告主线程:我收到了自己发给自己的Message");
                    mMainHandler.sendMessage(msg2);
                }
            }
        }
    }
}
public class MainActivity extends Activity {
    private Button mBtn;
    private TextView mText;
    private Handler mHandler;
    private Handler mMainHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) this.findViewById(R.id.btn);
        mText = (TextView) this.findViewById(R.id.view);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 启动线程
                new MyThread().start();
            }
        });
    }

    class MainHandler extends Handler {
        public MainHandler(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 11:
                    Log.d("gg", (String) msg.obj + msg.what);
                    mText.setText((String) msg.obj);
                    break;
            }
        }
    }

    class MyThread extends Thread {
        @Override
        public void run() {
            Looper.prepare(); // 创建该线程的Looper对象
            // 这里Looper.myLooper()获得的就是该线程的Looper对象了
            // Looper looper = Looper.getMainLooper();
            // Looper looper2 = Looper.myLooper(); // looper2 != looper
            mHandler = new ThreadHandler(Looper.myLooper());
            mHandler.obtainMessage(1, 2, 3, "我自己").sendToTarget();
            Looper.loop();
        }

        // 定义线程类中的消息处理类
        class ThreadHandler extends Handler {

            public ThreadHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                // 这里对该线程中的MessageQueue中的Message进行处理
                // 这里我们再返回给主线程一个消息
                // 加入判断看看是不是该线程自己发的信息
                switch (msg.what) {
                    case 1:
                        Log.d("gg", (String) msg.obj + msg.what);
                        mMainHandler = new MainHandler(Looper.getMainLooper());
                        mMainHandler.obtainMessage(11, 22, 33, "禀告主线程:我收到了自己发给自己的Message").sendToTarget();
                        break;
                }
            }
        }
    }
}
// 09-02 16:06:42.322: D/gg(7001): 我自己1
// 09-02 16:06:42.338: D/gg(7001): 禀告主线程:我收到了自己发给自己的Message11

class LooperThread extends Thread {
    public Handler mHandler;

    @Override
    public void run() {
        Looper.prepare();

        mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {

            }
        };

        Looper.loop();
    }
}


//通过Handler启动线程    
HandlerThread handlerThread = new HandlerThread("threadone");  
handlerThread.start();  
mHandler =  new Handler(handlerThread.getLooper());//那么这个Handler对象就是与HandlerThread这个线程绑定了(这时就不再是与UI线程绑定了,这样它处理耗时操作将不会阻塞UI)
mHandler.post(mRunnable);    

private Runnable mRunnable = new Runnable() {   
	@Override
	public void run() {    
		count++;    
		//setTitle("" +count);    
		//每2秒执行一次    
		mHandler.postDelayed(mRunnable, 2000);    
    }    
};    

是MessageQueue的管理者。

每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare()函数来实现的。同时每一个Looper对象和一个线程关联。
通过调用Looper.myLooper()可以获得当前线程的Looper对象
创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能
接受Message。
如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。
Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。

http://www.eoeandroid.com/thread-49595-1-1.html?_dsign=7a783b06


Android 之 Looper、MessageQueue、Handler 与消息循环

Handler主要用来发送消息和处理消息。每个handler实例都对应着一个线程和该线程的消息队列。
当你创建一个handler对象时,该handler对象就属于创建它的线程,并和该线程的消息队列绑定,比如在主线程中创建handler对象,那么该handler就只属于主线程,并且和主线程的消息队列绑定。








安卓中的消息循环机制Handler及Looper详解 我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handler机制来完成该功能,即当子线程中耗时操作完成后,在子线程中通过Handler向主线程发送消息,在主线程中的Handler的handleMessage方法中处理接受到的消息。这就是安卓中的消息机制,安 阅读详情

相关推荐

保姆级教程:在紫光同创Titan2 FPGA上实现PCIe DMA,实测带宽接近理论极限

本文详细介绍了在紫光同创Titan2 FPGA上实现PCIe DMA性能调优的全过程,通过参数优化和架构设计,实测带宽达到6.91GB/s,接近理论极限。涵盖开发环境搭建、PCIe IP核定制、DMA引擎设计、驱动开发及性能调优等关键步骤,为FPGA开发者提供实用指南。

weixin_30954817的博客 335

handler的obtainMessage

obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtianmessage可以循环利用; Message和obtainMessage()的用法区别: Message msg = handler.obtainMessage();      msg.arg1 = i;      msg.sendToTarget();    

qie7892683的专栏 917

MT4量化交易入门:手把手教你用MQL4编写第一个外汇EA(含完整代码)

本文详细介绍了如何使用MQL4在MT4平台上编写第一个外汇EA,涵盖从开发环境配置到均线交叉策略实现的完整流程。通过手把手教学和完整代码示例,帮助量化交易新手快速掌握外汇自动化交易的核心技术,实现高效的MT4量化交易系统。

mmm90的博客 527

Handler发送的消息通过obtain获取

话说在工作中第一次接触android 的Handler 的时候,不知道怎么去关注性能。这样使用并不是一定不允许,但是目前任何产品对于性能的要求越来越高,任何内存、调度的优化都是推荐的、可取的。

私房菜 2156

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5974

Windows/Linux双平台实战:QtCreator构建套件配置全攻略(含GCC/G++/GDB/CMake)

本文详细介绍了在Windows和Linux双平台下配置QtCreator构建套件的完整流程,涵盖GCC/G++、GDB和CMake等核心工具链的设置技巧。通过分步指导和实用示例,帮助开发者解决跨平台开发中的配置难题,提升Qt应用开发效率。特别针对QtCreator新手和需要在多平台切换的开发者提供了全面的配置指南。

weixin_28836507的博客 470

handler.obtainMessage()理解

在handler.obtainMessage()的参数是这样写的:Message android.os.Handler.obtainMessage(int what, int arg1, int arg2, Object obj)public final Message obtainMessage (int what, int arg1, int arg2, Object obj) Since: ...

weixin_34228617的博客 501

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 262

Android studio new Message与mHandler.obtainMessage的区别

和的主要区别在于它们的内存管理策略。总是创建一个新的对象,而则尝试从消息池中获取一个可重用的对象。在大多数情况下,使用是一个更好的选择,因为它有助于减少内存分配和GC压力。

谁呛我名字的博客 891

智能车八邻域图像算法

智能车八邻域图像算法

技术缝合怪的博客 4万+

基于RK3588边缘计算平台的人数统计系统设计与实现

针对人数统计场景优化的YOLOv5模型完整的模型转换和部署流程高效的嵌入式推理优化方案低成本、低功耗的部署方案实时性强,满足工业应用需求可扩展性好,适配多种应用场景引入注意力机制,提高小目标检测能力结合多模态信息,增强系统鲁棒性开发可视化管理平台,提升用户体验随着边缘计算和AIoT技术的快速发展,基于深度学习的智能视觉系统必将在更多领域发挥重要作用。本项目为相关应用的开发和部署提供了有价值的参考,为推动人工智能技术的产业化应用做出了积极贡献。

LXY_LOVE36的博客 146

android.os.handler包,【Android】Handler详解

* Handler的定义:* 主要接受子线程发送的数据, 并用此数据配合主线程更新UI。当应用程序启动时,* Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发,比如说,* 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。* 如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候...

weixin_29122445的博客 1141

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 849

安卓中的Handler是怎样的

Handler: 是实现android中不同线程间通信的一种机制,它允许主线程UI线程通过发送message和runable对象到handler,在其handler关联线程中处理这些消息和runnable、 其常用于执行异步任务处理,网络请求/文件读写等,将耗时操作放在单独线程中执行并通过handler进行返回UI主线程,可以避免阻塞UI主线程,提高响应速度。。<<<<////>>>>>Handler: 处理消息的对象,它负责发送和处理消息、sendMessage()/post()

lui0617的博客 861

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android :安卓学习笔记之 Handler机制 的简单理解和使用

Android Handler机制的简单理解和使用1、Handler使用引出2、背景和定义3、作用4、相关概念5、工作流程5.1、对应关系6、基本使用7、参考 1、Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎闪屏页面),如下图: 可能觉得直接开启一个包含倒序循环的子线程就ok了,具体实现如下: activity_main <?xml version="

JMW1407的博客 6776

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓的Handler机制

Android Handler机制解析 Handler机制是Android实现线程间通信的核心框架,主要由四个关键组件构成: Handler:消息发送和处理的桥梁,负责发送消息(sendMessage)和处理消息(handleMessage) Message:消息数据结构,包含what、obj、arg1/arg2等字段 MessageQueue:消息队列,负责消息的存储和管理 Looper:消息循环,从队列中取出消息并分发 每个线程只能拥有一个Looper,通过ThreadLocal保证线程隔离。使用Han

weixin_44078411的博客 1170

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android.os.handler

android.os.handler相关知识整理 Handler在android里负责发送和处理消息。它的主要用途有:   1)按计划发送消息或执行某个Runnanble(使用POST方法);   2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新

陈谏辉 1万+

Android基础之Handler分析,vivo安卓开发面试

这个锁,说明的是对所有调用同一个MessageQueue对象的线程来说,他们都是互斥的,然而在我们的Handler里 面,一个线程是对应着一个唯一的Looper对象,而Looper中又只有一个唯一的MessageQueue(这个在上文中也有介绍)。Handler是用于线程间通信的,但是它产生的根本并不只是用于UI处理,而更多的是handler是整个app通信的框架, 大家可以在ActivityThread里面感受到,整个App都是用它来进行线程间的协调。如果频繁的生成对象就会产生内存抖动,也会引发OOM。

m0_57502067的博客 1006

安卓handler机制

Handler Android中 ui的更新需要在主线程中进行,一些耗时的操作我们会放在后台线程中进行,而将执行结果在ui线程中进行。 安卓在设计时就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就无法更新ui信息,并抛出异常: 不能在非UI线程中去更新UI。 因此就引入了hanlder机制 特点 a. 允许你去发送并处理一条runnable对象和messageQueue相关联的信息。 b. 每一个handler的实例都与一个单独的线程 c. 当创建一个新的处理程序时,它将绑定到正在创建线程的线

weixin_47285644的博客 1109

安卓Handler

1.什么是Handler? Handler是安卓SDK中处理异步消息的核心类。 Handler的作用是让子线程通过与主线程通信来更新UI界面。 2.Handler的运行机制 创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来。 当我们在线程处理完数据后,可以通过Handler对象将消息发出。 消息将会会按顺序添加到消息队列中。 UI线程中的L...

qq_41451851的博客 1217

无法导入android.os.Handler

无法导入android.os.Handler

qq_25592833的博客 1756

Android中Handler简介

1.本文的阅读对象 本文的阅读对象是掌握了一些安卓基础知识的朋友,本文不会涉及源码,也不会有过多代码,对新手比较友好,用简单容易理解的语言描述Handler在安卓开发中的作用 2.Handler是什么? 我们先从字面分析,Handler由英文直译,可以翻译为处理者。在Android中,Handler机制主要用作异步消息处理,这是谷歌设计的一套机制,能帮助我们有序的处理异步操作。 3.And

周敬斌的博客 1240

【Android】Handler,安卓内存优化管理器

============================================================================= 1. Looper和消息队列机制 Handler持有了一个消息队列MessageQueue对象mQueue。这个对象是Handler实例构造的时候,通过Looper传递过来的。当使用无参构造方法时,这个Looper为Looper.myLooper()。 public Handler() { // 。。。 mLooper = Looper.myLoope

wq221aas的博客 528

安卓Handler机制

Handler机制运用在安卓线程之间的消息传递。Handler之所以能够运行,得力于与Handler紧密相联的Looper,每一个线程都只能有一个Looper,一个Looper就可以看成一个事件执行者,Handler决定对事件做什么具体操作,所以一般继承了Handler就要重写其中的handleMessage方法,那么事件从哪里来呢?从消息队列MessageQueue中得来。 Handler的使用...

whoami_I的博客 1550

android handler面试,安卓Handler机制学习笔记附面试问题

基础知识Handler 机制相关的概念包括 Handler、Message 、Message Queue、Looper具体如下图相关的概念核心方法接下来我们将四个相关的类一个个按着源码来看一遍MessageMessage是信息传递的载体里面没有太多逻辑就是包括一些信息传递机制里面必须要用到的属性主要看其构造函数的源码public static Message obtain() {synchroni...

weixin_34835470的博客 166
上一篇: android中的static
下一篇: DisplayMetrics和Display浅析
dcking
博客等级 码龄18年 8粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值