接下来我们再看看应用程序的配置文件AndroidManifest.xml:
        
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="shy.luo.counter"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7. <activityandroid:name=".Counter"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <actionandroid:name="android.intent.action.MAIN"/>
  11. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  12. </intent-filter>
  13. </activity>
  14. </application>
  15. </manifest>
这个配置文件很简单,我们就不介绍了。 再来看应用程序的界面文件,它定义在res/layout/main.xml文件中:
            
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:gravity="center">
  7. <LinearLayout
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_marginBottom="10px"
  11. android:orientation="horizontal"
  12. android:gravity="center">
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_marginRight="4px"
  17. android:gravity="center"
  18. android:text="@string/counter">
  19. </TextView>
  20. <TextView
  21. android:id="@+id/textview_counter"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:gravity="center"
  25. android:text="0">
  26. </TextView>
  27. </LinearLayout>
  28. <LinearLayout
  29. android:layout_width="fill_parent"
  30. android:layout_height="wrap_content"
  31. android:orientation="horizontal"
  32. android:gravity="center">
  33. <Button
  34. android:id="@+id/button_start"
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:gravity="center"
  38. android:text="@string/start">
  39. </Button>
  40. <Button
  41. android:id="@+id/button_stop"
  42. android:layout_width="wrap_content"
  43. android:layout_height="wrap_content"
  44. android:gravity="center"
  45. android:text="@string/stop">
  46. </Button>
  47. </LinearLayout>
  48. </LinearLayout>
这个界面配置文件也很简单,等一下我们在模拟器把这个应用程序启动起来后,就可以看到它的截图了。 应用程序用到的字符串资源文件位于res/values/strings.xml文件中:
        
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="app_name">Counter</string>
  4. <stringname="counter">Counter:</string>
  5. <stringname="start">StartCounter</string>
  6. <stringname="stop">StopCounter</string>
  7. </resources>
最后,我们还要在工程目录下放置一个编译脚本文件Android.mk:
        
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS:=optional
  4. LOCAL_SRC_FILES:=$(callall-subdir-java-files)
  5. LOCAL_PACKAGE_NAME:=Counter
  6. include$(BUILD_PACKAGE)
接下来就要编译了。有关如何单独编译Android源代码工程的模块,以及如何打包system.img,请参考 如何单独编译Android源代码中的模块 一文。 执行以下命令进行编译和打包:
        
  1. USER-NAME@MACHINE-NAME:~/Android$mmmpackages/experimental/Counter
  2. USER-NAME@MACHINE-NAME:~/Android$makesnod
这样,打包好的Android系统镜像文件system.img就包含我们前面创建的Counter应用程序了。
再接下来,就是运行模拟器来运行我们的例子了。关于如何在Android源代码工程中运行模拟器,请参考
在Ubuntu上下载、编译和安装Android最新源代码 一文。 执行以下命令启动模拟器:
        
  1. USER-NAME@MACHINE-NAME:~/Android$emulator
最后我们就可以在Launcher中找到Counter应用程序图标,把它启动起来,点击Start按钮,就会看到应用程序界面上的计数器跑起来了: 这样,使用AsyncTask的例子就介绍完了,下面,我们就要根据上面对AsyncTask的使用情况来重点分析它的实现了。
AsyncTask类定义在frameworks/base/core/java/android/os/AsyncTask.java文件中:
        
  1. publicabstractclassAsyncTask<Params,Progress,Result>{
  2. ......
  3. privatestaticfinalBlockingQueue<Runnable>sWorkQueue=
  4. newLinkedBlockingQueue<Runnable>(10);
  5. privatestaticfinalThreadFactorysThreadFactory=newThreadFactory(){
  6. privatefinalAtomicIntegermCount=newAtomicInteger(1);
  7. publicThreadnewThread(Runnabler){
  8. returnnewThread(r,"AsyncTask#"+mCount.getAndIncrement());
  9. }
  10. };
  11. ......
  12. privatestaticfinalThreadPoolExecutorsExecutor=newThreadPoolExecutor(CORE_POOL_SIZE,
  13. MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS,sWorkQueue,sThreadFactory);
  14. privatestaticfinalintMESSAGE_POST_RESULT=0x1;
  15. privatestaticfinalintMESSAGE_POST_PROGRESS=0x2;
  16. privatestaticfinalintMESSAGE_POST_CANCEL=0x3;
  17. privatestaticfinalInternalHandlersHandler=newInternalHandler();
  18. privatefinalWorkerRunnable<Params,Result>mWorker;
  19. privatefinalFutureTask<Result>mFuture;
  20. ......
  21. publicAsyncTask(){
  22. mWorker=newWorkerRunnable<Params,Result>(){
  23. publicResultcall()throwsException{
  24. ......
  25. returndoInBackground(mParams);
  26. }
  27. };
  28. mFuture=newFutureTask<Result>(mWorker){
  29. @Override
  30. protectedvoiddone(){
  31. Messagemessage;
  32. Resultresult=null;
  33. try{
  34. result=get();
  35. }catch(InterruptedExceptione){
  36. android.util.Log.w(LOG_TAG,e);
  37. }catch(ExecutionExceptione){
  38. thrownewRuntimeException("AnerroroccuredwhileexecutingdoInBackground()",
  39. e.getCause());
  40. }catch(CancellationExceptione){
  41. message=sHandler.obtainMessage(MESSAGE_POST_CANCEL,
  42. newAsyncTaskResult<Result>(AsyncTask.this,(Result[])null));
  43. message.sendToTarget();
  44. return;
  45. }catch(Throwablet){
  46. thrownewRuntimeException("Anerroroccuredwhileexecuting"
  47. +"doInBackground()",t);
  48. }
  49. message=sHandler.obtainMessage(MESSAGE_POST_RESULT,
  50. newAsyncTaskResult<Result>(AsyncTask.this,result));
  51. message.sendToTarget();
  52. }
  53. };
  54. }
  55. ......
  56. publicfinalResultget()throwsInterruptedException,ExecutionException{
  57. returnmFuture.get();
  58. }
  59. ......
  60. publicfinalAsyncTask<Params,Progress,Result>execute(Params...params){
  61. ......
  62. mWorker.mParams=params;
  63. sExecutor.execute(mFuture);
  64. returnthis;
  65. }
  66. ......
  67. protectedfinalvoidpublishProgress(Progress...values){
  68. sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
  69. newAsyncTaskResult<Progress>(this,values)).sendToTarget();
  70. }
  71. privatevoidfinish(Resultresult){
  72. ......
  73. onPostExecute(result);
  74. ......
  75. }
  76. ......
  77. privatestaticclassInternalHandlerextendsHandler{
  78. @SuppressWarnings({"unchecked","RawUseOfParameterizedType"})
  79. @Override
  80. publicvoidhandleMessage(Messagemsg){
  81. AsyncTaskResultresult=(AsyncTaskResult)msg.obj;
  82. switch(msg.what){
  83. caseMESSAGE_POST_RESULT:
  84. //Thereisonlyoneresult
  85. result.mTask.finish(result.mData[0]);
  86. break;
  87. caseMESSAGE_POST_PROGRESS:
  88. result.mTask.onProgressUpdate(result.mData);
  89. break;
  90. caseMESSAGE_POST_CANCEL:
  91. result.mTask.onCancelled();
  92. break;
  93. }
  94. }
  95. }
  96. privatestaticabstractclassWorkerRunnable<Params,Result>implementsCallable<Result>{
  97. Params[]mParams;
  98. }
  99. privatestaticclassAsyncTaskResult<Data>{
  100. finalAsyncTaskmTask;
  101. finalData[]mData;
  102. AsyncTaskResult(AsyncTasktask,Data...data){
  103. mTask=task;
  104. mData=data;
  105. }
  106. }
  107. }

更多相关文章

  1. Android中音频文件的使用
  2. Android播放ogg声音文件
  3. android 通过pull解析xml文件
  4. android studio 文件重命名快捷键
  5. 如何实现Android重启应用程序代码 ?
  6. android 应用程序 集合
  7. android 检测应用程序信息

随机推荐

  1. android drawBitmapMesh and drawVertice
  2. eclipse项目导入android studio 各类问题
  3. Android知识点总结:Android选取、拍照与裁
  4. Android(安卓)React Native环境配置以及
  5. android 各个版本的发布时间与变动---and
  6. android上使用 google map 会遇到的一些
  7. Android之Tab分页标签的实现方法一-----T
  8. Android实践系列之项目基础配置
  9. android手机短信屏蔽
  10. [Unity] 在Unity中导入Android原生插件