首页 文章 精选 留言 我的

精选列表

搜索[android jetpack],共10000篇文章
优秀的个人博客,低调大师

Android:线程间通讯的其他方法、runOnUiThread(action)、Handler.post(action)、post

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 public class MainActivity extends Activity implements OnClickListener { TextViewtextView= null ; private ViewmProgress; private HandlermHandler= new Handler(); @Override protected void onCreate(BundlesavedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button1).setOnClickListener( this ); findViewById(R.id.button2).setOnClickListener( this ); textView=(TextView)findViewById(R.id.textView1); mProgress=findViewById(R.id.progressBar1); } @Override public boolean onCreateOptionsMenu(Menumenu) { getMenuInflater().inflate(R.menu.activity_main,menu); return true ; } @Override public void onClick(Viewv) { switch (v.getId()) { case R.id.button1: btn1Click(); break ; default : break ; } } private void btn1Click() { mProgress.setVisibility(View.VISIBLE); new Thread() { @Override public void run() { final Stringstr=update(); Runnableaction= new Runnable() //该方法仍然是在main线程中完成的 { @Override public void run() //run里进行main线程的事件 { textView.setText(str); mProgress.setVisibility(View.GONE); Log.e( "runnable" ,Thread.currentThread().getName()); } }; /* *除Handler外的其他三种方法,适用于控件较少的场景 */ runOnUiThread(action); //方法一 textView.post(action); //方法二,post方法执行前会调用 mHandler.post(action); //方法三 mHandler.postDelayed(action, 3000 ); //方法三可以加个延时 } }.start(); } private Stringupdate() { return "更新完成!" ; } } 注: 1.handler.post这个函数的作用是把Runnable里面的run方法里面的这段代码发送到消息队列中,等待运行。如果handler是以UI线程消息队列为参数构造的,那么是把run里面的代码发送到UI线程中,等待UI线程运行这段代码。如果handler是以子线程线程消息队列为参数构造的,那么是把run里面的代码发送到子线程中,等待子线程运行这段代码。 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1206265,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(4)

2.MemoryBase 文章开始时说过,MemoryBase接口是建立在MemoryHeapBase接口的基础上的,它们都可以作为一个Binder对象来在进程间进行数据共享,它们的关系如下所示: MemoryBase类包含了一个成员变量mHeap,它的类型的IMemoryHeap,MemoryBase类所代表的匿名共享内存就是通过这个成员变量来实现的。 与MemoryHeapBase的分析过程一样,我们先来看MemoryBase类在Server端的实现,然后再来看它在Client端的实现。 MemoryBase在Server端实现的类图如下所示: MemoryBase类在Server端的实现与MemoryHeapBase类在Server端的实现是类似的,这里只要把IMemory类换成IMemoryHeap类、把BnMemory类换成BnMemoryHeap类以及MemoryBase类换成MemoryHeapBase类就变成是MemoryHeapBase类在Server端的实现了,因此,我们这里只简单分析IMemory类和MemoryBase类的实现。 IMemory类定义了MemoryBase类所需要实现的接口,这个类定义在frameworks/base/include/binder/IMemory.h文件中: classIMemory:publicIInterface { public: ...... virtualsp<IMemoryHeap>getMemory(ssize_t*offset=0,size_t*size=0)const=0; ...... void*pointer()const; size_tsize()const; ssize_toffset()const; }; 成员函数getMemory用来获取内部的MemoryHeapBase对象的IMemoryHeap接口;成员函数pointer()用来获取内部所维护的匿名共享内存的基地址;成员函数size()用来获取内部所维护的匿名共享内存的大小;成员函数offset()用来获取内部所维护的这部分匿名共享内存在整个匿名共享内存中的偏移量。 IMemory类本身实现了pointer、size和offset三个成员函数,因此,它的子类,即MemoryBase类,只需要实现getMemory成员函数就可以了。IMemory类的实现定义在frameworks/base/libs/binder/IMemory.cpp文件中: void*IMemory::pointer()const{ ssize_toffset; sp<IMemoryHeap>heap=getMemory(&offset); void*constbase=heap!=0?heap->base():MAP_FAILED; if(base==MAP_FAILED) return0; returnstatic_cast<char*>(base)+offset; } size_tIMemory::size()const{ size_tsize; getMemory(NULL,&size); returnsize; } ssize_tIMemory::offset()const{ ssize_toffset; getMemory(&offset); returnoffset; } MemoryBase类声明在frameworks/base/include/binder/MemoryBase.h文件中: classMemoryBase:publicBnMemory { public: MemoryBase(constsp<IMemoryHeap>&heap,ssize_toffset,size_tsize); ...... virtualsp<IMemoryHeap>getMemory(ssize_t*offset,size_t*size)const; ...... private: size_tmSize; ssize_tmOffset; sp<IMemoryHeap>mHeap; }; MemoryBase类实现在frameworks/base/libs/binder/MemoryBase.cpp文件中: MemoryBase::MemoryBase(constsp<IMemoryHeap>&heap, ssize_toffset,size_tsize) :mSize(size),mOffset(offset),mHeap(heap) { } sp<IMemoryHeap>MemoryBase::getMemory(ssize_t*offset,size_t*size)const { if(offset)*offset=mOffset; if(size)*size=mSize; returnmHeap; } 在它的构造函数中,接受三个参数,参数heap指向的是一个MemoryHeapBase对象,真正的匿名共享内存就是由它来维护的,参数offset表示这个MemoryBase对象所要维护的这部分匿名共享内存在整个匿名共享内存块中的起始位置,参数size表示这个MemoryBase对象所要维护的这部分匿名共享内存的大小。 成员函数getMemory的实现很简单,只是简单地返回内部的MemoryHeapBase对象的IMemoryHeap接口,如果传进来的参数offset和size不为NULL,还会把其内部维护的这部分匿名共享内存在整个匿名共享内存块中的偏移位置以及这部分匿名共享内存的大小返回给调用者。 这里我们可以看出,MemoryBase在Server端的实现只是简单地封装了MemoryHeapBase的实现。1 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966918,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册