当前位置: 首页 > wzjs >正文

做自媒体好还是网站好学网站开发多久

做自媒体好还是网站好,学网站开发多久,如何优化wordpress,越南做购物网站背景: 前面分享过一篇文章已经针对Handler和Message进行了详细的源码分析,从上到下对安卓的消息机制进行讲解。在了解了整个消息机制的原理后,可能大家对消息机制都有了一个新的高度。但是想要进一步的深刻理解消息机制的作用,那…

背景:

前面分享过一篇文章已经针对Handler和Message进行了详细的源码分析,从上到下对安卓的消息机制进行讲解。在了解了整个消息机制的原理后,可能大家对消息机制都有了一个新的高度。但是想要进一步的深刻理解消息机制的作用,那么还是需要针对消息机制进行相关的实战使用。
大家在java层面经常都会使用到Hander,Message,Looper,但是学习了前面的消息机制后,其实native层面也是完全可以和java层一样使用消息机制,所以本文主要在native层面来使用Looper,Message,Handler组成的消息机制。
在这里插入图片描述

回顾java层面消息机制

一般java层一个子线程需要使用消息循环一般会有如下代码:
在这里插入图片描述
主要分为如下几步:
1、初始化Loop,通过调用Looper.prepare方法
2、构造基于初始化的Loop构造出Handler
3、Loop启动循环等待消息
4、Handler接收处理消息

回顾了Java端的消息机制使用流程后,再来写native的就方便多了。

native层面消息机制实战代码

其实native端使用消息机制步骤和java端基本上一样,也是如下几步
1、初始化Loop,通过调用Looper.prepare方法
2、构造基于初始化的Loop构造出Handler
3、Loop启动循环等待消息
4、Handler接收处理消息

其实关于native层面的消息机制使用aosp原生也有相关的测试文件可以参考,本文的实战demo就是基于这个测试案例进行的改造:
测试文件案例参考地址:

system/core/libutils/Looper_test.cpp

下面展示改造后的实战demo:

#define LOG_TAG "LooperTest"
#include "Pipe.h"
#include <stdio.h>
#include <utils/Looper.h>
#include <unistd.h>
#include <time.h>
#include <utils/threads.h>using namespace android;
using namespace std;
Pipe pipe1;//管道对象,主要就是搞个管道fd,这样可以不使用Looper自带fdclass CallbackHandler {
public:CallbackHandler(){}void setCallback(const sp<Looper>& looper, int fd, int events) {looper->addFd(fd, 0, events, staticHandler, this);//本质也是调用Looper的addFd进行fd监听}protected:int handler(int fd, int events) {printf("[Thread=%d] %s fd=%d, events=%d,  pipe1.readSignal() = %s\n", gettid(), __func__, fd, events, pipe1.readSignal() == OK ? "OK":"NOT OK");return 0;}private:static int staticHandler(int fd, int events, void* data) {return static_cast<CallbackHandler*>(data)->handler(fd, events);}
};class LooperEventCallback : public LooperCallback {public:using Callback = std::function<int(int fd, int events)>;explicit LooperEventCallback(Callback callback) : mCallback(std::move(callback)) {}//这里handleEvent其实直接调用了mCallback,当然也可以handleEvent直接处理相关业务int handleEvent(int fd, int events, void* /*data*/) override { return mCallback(fd, events); }private:Callback mCallback;
};class MyMessageHandler : public MessageHandler {
public:Vector<Message> messages;virtual void handleMessage(const Message& message) {printf("[Thread=%d] %s message.what=%d \n", gettid(), __func__, message.what);messages.push(message);}
};struct LooperThread : public Thread {
public:LooperThread(Looper *looper): mLooper(looper) {}virtual bool threadLoop() {if(mLooper == NULL)return false;mLooper->pollOnce(-1);//进行Looper循环return true;}protected:virtual ~LooperThread() {}private:Looper *mLooper;
};int main()
{printf("process %s  pid = %d\n", LOG_TAG,getpid());sp<Looper> mLooper = new Looper(true);//构建Looper对象sp<LooperThread> mLooperThread = new LooperThread(mLooper.get());//使用该Looper构建对应的ThreadmLooperThread->run("LooperThreadTest");//让Thread运行,让Looper进行循环//------------------开始使用自带Message进行消息传递,也就是使用的fd其实是Looper自带的mWakeEventFdsp<MyMessageHandler> handler = new MyMessageHandler();printf("[Thread=%d] sendMessage message.what=%d \n", gettid(), 1);mLooper->sendMessage(handler, Message(1));//主线程发送消息sleep(1);//-------------------开始使用Looper监听用户自定义fd方式,这里演示两种回调方式 //1.直接函数指针回调法CallbackHandler mCallbackHandler;//注意这里使用的是 pipe1.receiveFd管道fdmCallbackHandler.setCallback(mLooper, pipe1.receiveFd, Looper::EVENT_INPUT);printf("[Thread=%d] writeSignal 1\n", gettid());pipe1.writeSignal(); sleep(1);//2.使用LooperCallback这种回调方法auto testCallback = [](int fd, int events) {if ((events & Looper::EVENT_INPUT) == 0) {return 1;  }char buf[1];int size = (int)::read(fd, buf, 1);printf("[Thread %d]  testCallback EVENT_INPUT buf = %c size = %d\n", gettid(),buf[0],size);return 0;  };mLooper->addFd( pipe1.receiveFd, 0, Looper::EVENT_INPUT, new LooperEventCallback(std::move(testCallback)), nullptr);printf("[Thread=%d] writeSignal 2\n", gettid());pipe1.writeSignal();sleep(2);mLooperThread->requestExit();mLooper.clear();
}

整体实战demo案例设计图如下:
在这里插入图片描述
代码中本身已经有详细的注释进行解释,这里也就不需要多说,大家看代码既可以。

实战成果展示:

process LooperTest  pid = 2711  ---进程号,主线程号-------默认Looper自带fd部分
[Thread=2711] sendMessage message.what=1  ---主线程发送默认消息,传递what为1
[Thread=2712] handleMessage message.what=1 ---子线程handler中接受到进行处理-------自定义Looper的fd部分
[Thread=2711] writeSignal 1   ---主线程给管道fd写入数据
[Thread=2712] handler fd=3, events=1,  pipe1.readSignal() = OK  ---子线程通过函数指针方式回调接受到[Thread=2711] writeSignal 2  ---主线程给管道fd写入数据
[Thread 2712]  testCallback EVENT_INPUT buf = a size = 1  ---子线程通过LooperCallback方式回调接受到

文章参考来源:https://mp.weixin.qq.com/s/g5rauYoW8KpomvDkr73Y7Q

更多framework实战干货,请关注下面“千里马学框架”


文章转载自:

http://m8QJT6fi.yhtnr.cn
http://6UGQGR40.yhtnr.cn
http://CxGZ9fk4.yhtnr.cn
http://uqmnIQEV.yhtnr.cn
http://OpBxn9qa.yhtnr.cn
http://eHBy6Fsw.yhtnr.cn
http://bR1VBTrv.yhtnr.cn
http://j8MXrOfI.yhtnr.cn
http://xdKR7fhK.yhtnr.cn
http://8H99pBTM.yhtnr.cn
http://tBIRRfRE.yhtnr.cn
http://Ox3gHcMw.yhtnr.cn
http://I6BLot9c.yhtnr.cn
http://wNhb5lvQ.yhtnr.cn
http://GVSetugf.yhtnr.cn
http://Lec3Oeph.yhtnr.cn
http://82hsjSRB.yhtnr.cn
http://nzIgjEbm.yhtnr.cn
http://82NBA9s2.yhtnr.cn
http://YFowh6N3.yhtnr.cn
http://IefBWUPo.yhtnr.cn
http://IskSiHkC.yhtnr.cn
http://wrDWpkOD.yhtnr.cn
http://KipQsV5B.yhtnr.cn
http://VZWKLZzh.yhtnr.cn
http://SW5XPnLa.yhtnr.cn
http://Sd6Nr0Bu.yhtnr.cn
http://DxuYOU6r.yhtnr.cn
http://OvQ9VM2b.yhtnr.cn
http://c0Iac4b7.yhtnr.cn
http://www.dtcms.com/wzjs/763967.html

相关文章:

  • 网站报价单模板网页设计的版式有哪些
  • 广州网站制作哪里好html5做网站优势
  • 中国手表网站祁阳做网站
  • python爬虫做网站郑州网站制作招聘
  • 网站关键词优化外包服务江北区网络推广技巧
  • 云服务器 多个网站如何建立一个大型的网站
  • 用wordpress做购物网站公司大全免费查询
  • 做淘客网站要多大的服务器wordpress 按点击排序
  • 网站案例英文营销网站中最重要的部分是
  • 网站背景图片素材 唯美网页设计模板免费下载网站
  • 给人做网站赚钱吗h5网页制作模板
  • python购物网站开发流程图下载了字体如何安装在wordpress
  • 东莞金融网站建设html静态网站模板
  • 大名网站建设莱芜信誉好的网络推广公司
  • 汕头老城图片怀化网站优化
  • 做个网站需要多久网站设计费用多少山西seo关键词优化软件搜索
  • 完成职教集团网站建设华讯网络工程师待遇
  • wordpress grace 下载浙江seo博客
  • 网站icp备案查询截图重庆企业seo网络推广外包
  • 上传文档网站开发建设运营平台网站的方法
  • 1920的网站做字体大小企业网站维护怎么做
  • 重庆大良网站建设用ps制作海报教程方法步骤
  • 房屋网在线seo
  • 推荐几个安全没封的网站2021深圳专业网站建设企
  • 仿魔酷阁网站源码网页游戏传奇世界网页版
  • 广西建设培训中心网站2021百度新算法优化
  • 贵阳网站建设托管物联网设计方案
  • 宁陵视频网站建设贵阳网站seo
  • 做动画的网站有哪些QQ点钓鱼网站后怎么做
  • 四会建设局网站织梦设置中英文网站