首页 文章 精选 留言 我的

精选列表

搜索[自由线程],共10000篇文章
优秀的个人博客,低调大师

Android应用程序线程消息循环模型分析(4)

接下来我们再看看应用程序的配置文件AndroidManifest.xml: <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="shy.luo.counter" android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".Counter" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> 这个配置文件很简单,我们就不介绍了。 再来看应用程序的界面文件,它定义在res/layout/main.xml文件中: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10px" android:orientation="horizontal" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="4px" android:gravity="center" android:text="@string/counter"> </TextView> <TextView android:id="@+id/textview_counter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="0"> </TextView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <Button android:id="@+id/button_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="@string/start"> </Button> <Button android:id="@+id/button_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="@string/stop"> </Button> </LinearLayout> </LinearLayout> 这个界面配置文件也很简单,等一下我们在模拟器把这个应用程序启动起来后,就可以看到它的截图了。 应用程序用到的字符串资源文件位于res/values/strings.xml文件中: <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="app_name">Counter</string> <stringname="counter">Counter:</string> <stringname="start">StartCounter</string> <stringname="stop">StopCounter</string> </resources> 最后,我们还要在工程目录下放置一个编译脚本文件Android.mk: LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODULE_TAGS:=optional LOCAL_SRC_FILES:=$(callall-subdir-java-files) LOCAL_PACKAGE_NAME:=Counter include$(BUILD_PACKAGE) 接下来就要编译了。有关如何单独编译Android源代码工程的模块,以及如何打包system.img,请参考 如何单独编译Android源代码中的模块 一文。 执行以下命令进行编译和打包: USER-NAME@MACHINE-NAME:~/Android$mmmpackages/experimental/Counter USER-NAME@MACHINE-NAME:~/Android$makesnod 这样,打包好的Android系统镜像文件system.img就包含我们前面创建的Counter应用程序了。 再接下来,就是运行模拟器来运行我们的例子了。关于如何在Android源代码工程中运行模拟器,请参考 在Ubuntu上下载、编译和安装Android最新源代码 一文。 执行以下命令启动模拟器: USER-NAME@MACHINE-NAME:~/Android$emulator 最后我们就可以在Launcher中找到Counter应用程序图标,把它启动起来,点击Start按钮,就会看到应用程序界面上的计数器跑起来了: 这样,使用AsyncTask的例子就介绍完了,下面,我们就要根据上面对AsyncTask的使用情况来重点分析它的实现了。 AsyncTask类定义在frameworks/base/core/java/android/os/AsyncTask.java文件中: publicabstractclassAsyncTask<Params,Progress,Result>{ ...... privatestaticfinalBlockingQueue<Runnable>sWorkQueue= newLinkedBlockingQueue<Runnable>(10); privatestaticfinalThreadFactorysThreadFactory=newThreadFactory(){ privatefinalAtomicIntegermCount=newAtomicInteger(1); publicThreadnewThread(Runnabler){ returnnewThread(r,"AsyncTask#"+mCount.getAndIncrement()); } }; ...... privatestaticfinalThreadPoolExecutorsExecutor=newThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS,sWorkQueue,sThreadFactory); privatestaticfinalintMESSAGE_POST_RESULT=0x1; privatestaticfinalintMESSAGE_POST_PROGRESS=0x2; privatestaticfinalintMESSAGE_POST_CANCEL=0x3; privatestaticfinalInternalHandlersHandler=newInternalHandler(); privatefinalWorkerRunnable<Params,Result>mWorker; privatefinalFutureTask<Result>mFuture; ...... publicAsyncTask(){ mWorker=newWorkerRunnable<Params,Result>(){ publicResultcall()throwsException{ ...... returndoInBackground(mParams); } }; mFuture=newFutureTask<Result>(mWorker){ @Override protectedvoiddone(){ Messagemessage; Resultresult=null; try{ result=get(); }catch(InterruptedExceptione){ android.util.Log.w(LOG_TAG,e); }catch(ExecutionExceptione){ thrownewRuntimeException("AnerroroccuredwhileexecutingdoInBackground()", e.getCause()); }catch(CancellationExceptione){ message=sHandler.obtainMessage(MESSAGE_POST_CANCEL, newAsyncTaskResult<Result>(AsyncTask.this,(Result[])null)); message.sendToTarget(); return; }catch(Throwablet){ thrownewRuntimeException("Anerroroccuredwhileexecuting" +"doInBackground()",t); } message=sHandler.obtainMessage(MESSAGE_POST_RESULT, newAsyncTaskResult<Result>(AsyncTask.this,result)); message.sendToTarget(); } }; } ...... publicfinalResultget()throwsInterruptedException,ExecutionException{ returnmFuture.get(); } ...... publicfinalAsyncTask<Params,Progress,Result>execute(Params...params){ ...... mWorker.mParams=params; sExecutor.execute(mFuture); returnthis; } ...... protectedfinalvoidpublishProgress(Progress...values){ sHandler.obtainMessage(MESSAGE_POST_PROGRESS, newAsyncTaskResult<Progress>(this,values)).sendToTarget(); } privatevoidfinish(Resultresult){ ...... onPostExecute(result); ...... } ...... privatestaticclassInternalHandlerextendsHandler{ @SuppressWarnings({"unchecked","RawUseOfParameterizedType"}) @Override publicvoidhandleMessage(Messagemsg){ AsyncTaskResultresult=(AsyncTaskResult)msg.obj; switch(msg.what){ caseMESSAGE_POST_RESULT: //Thereisonlyoneresult result.mTask.finish(result.mData[0]); break; caseMESSAGE_POST_PROGRESS: result.mTask.onProgressUpdate(result.mData); break; caseMESSAGE_POST_CANCEL: result.mTask.onCancelled(); break; } } } privatestaticabstractclassWorkerRunnable<Params,Result>implementsCallable<Result>{ Params[]mParams; } privatestaticclassAsyncTaskResult<Data>{ finalAsyncTaskmTask; finalData[]mData; AsyncTaskResult(AsyncTasktask,Data...data){ mTask=task; mData=data; } } } 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966885,如需转载请自行联系原作者

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

函数第二部分:动态参数是自由主义的体现-Python基础前传(11)

编程语言就是大家一起定个规则大家一起玩。规则是人定的,但也是定给人的。我们之前学习函数的参数,都遵循着一个原则就是:形式参数有几个,实际参数就只能传几个;我们从开发 python 这门编程语言的角度思考,我们要是真的就是规定形式参数有几个,实际参数就有几个的原则,是不是不能满足实际工作需要,在实际工作中谁又能保证每一次都预先设定好参数的个数呢?这个时候,作为编程语言的设计人员,就会引进动态参数,我们想想如果不引入动态参数,谁还能使用这个编程语言呢。 (一)动态参数1-一个星号变元组 动态参数存在的意义? 函数的作者有时候也不知道这个函数到底需要多少个参数,这时候动态参数就有存在的意义了 动态参数创建-加 * 底层原理是:把数值型或其他数据类型变成了元组类型,是元组了就可以多加实际参数了(一个星号变元组,传的参数就是元组的元素) #不用动态参数def f1(a):print(a,type(a)) f1(123)>>> 123 <class'int'>#使用动态参数def f1(*a):print(a,type(a)) f1(123,456,789)>>> (123,456,789) <class'tuple'> f1(123,[11,22,33],{"key1":"values2"})>>>(123,[11,22,33],{"k1":"values2"}) <class 'tuple'> (二)动态参数2-两个星号变字典 def f1(**a):print(a,type(a)) f1(k1=123,k2=456)>>>{'k1':123,'k2':456} <class 'dict'> 说到这里,大家有没有注意到一个问题:就是动态1(1个星号)是元组只能是元组,动态2(2个星号)是字典只能是字典,我们有没有什么办法,将动态1和动态2组合起来,让我们参数既可以是元组,又可以是字典呢? def f1(*a,**aa):print(a,type(a))print(aa, type(aa)) f1(11,22,33,k1=123,k2=456)>>>(11, 22, 33) <class 'tuple'>>>>{'k1': 123, 'k2': 456} <class 'dict'> 这里 jacky 要给大家强调的是:*a 一定要放在 **a 前面,顺序不能颠倒,这是固定写法 (三)动态参数的规范书写 一般情况下,把动态参数设置成如下规范形式 # *args, **kwargsdef f1(*args,**kwargs` ) 为动态参数传入列表、字典、元组 def f1(*args):print(args,type(args)) li = [11,22,33] f1(li) f1(*li) #加*相当于for循环遍历了列表里的元素>>>([11,22,33],)<class 'tuple'>>>>(11,22,33)<class 'tuple'>def f1(**kwargs):print(kwargs,type(kwargs)) dic = {"k1":123} f1(k1=dic) f1(**dic)>>>{'k1':{'k1':123}}<class 'dict'>>>> {'k1':123}<class 'dict'>

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

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

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部分的功能。

用户登录
用户注册