日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/4/16 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序线程消息循环模型分析(4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接下來我們再看看應用程序的配置文件AndroidManifest.xml:
  • <?xml?version="1.0"?encoding="utf-8"?>???
  • <manifest?xmlns:android="http://schemas.android.com/apk/res/android"???
  • package="shy.luo.counter"???
  • android:versionCode="1"???
  • android:versionName="1.0">???
  • <application?android:icon="@drawable/icon"?android:label="@string/app_name">???
  • <activity?android:name=".Counter"???
  • android:label="@string/app_name">???
  • <intent-filter>???
  • <action?android:name="android.intent.action.MAIN"?/>???
  • <category?android:name="android.intent.category.LAUNCHER"?/>???
  • </intent-filter>???
  • </activity>???
  • </application>???
  • </manifest>???
  • 這個配置文件很簡單,我們就不介紹了。 再來看應用程序的界面文件,它定義在res/layout/main.xml文件中:
  • <?xml?version="1.0"?encoding="utf-8"?>?????
  • <LinearLayout?xmlns: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文件中:
  • <?xml?version="1.0"?encoding="utf-8"?>?????
  • <resources>?????
  • ????<string?name="app_name">Counter</string>?????
  • ????<string?name="counter">Counter:?</string>?????
  • ????<string?name="start">Start?Counter</string>?????
  • ????<string?name="stop">Stop?Counter</string>?????
  • </resources>????
  • 最后,我們還要在工程目錄下放置一個編譯腳本文件Android.mk:
  • LOCAL_PATH:=?$(call?my-dir)???????????
  • include?$(CLEAR_VARS)???????????
  • ???????????
  • LOCAL_MODULE_TAGS?:=?optional???????????
  • ???????????
  • LOCAL_SRC_FILES?:=?$(call?all-subdir-java-files)???????????
  • ???????????
  • LOCAL_PACKAGE_NAME?:=?Counter???????????
  • ???????????
  • include?$(BUILD_PACKAGE)?????
  • 接下來就要編譯了。有關如何單獨編譯Android源代碼工程的模塊,以及如何打包system.img,請參考如何單獨編譯Android源代碼中的模塊一文。 執行以下命令進行編譯和打包:
  • USER-NAME@MACHINE-NAME:~/Android$?mmm?packages/experimental/Counter?????????????
  • USER-NAME@MACHINE-NAME:~/Android$?make?snod???
  • 這樣,打包好的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文件中:
  • public?abstract?class?AsyncTask<Params,?Progress,?Result>?{???
  • ????......???
  • ???
  • ????private?static?final?BlockingQueue<Runnable>?sWorkQueue?=???
  • ????????????new?LinkedBlockingQueue<Runnable>(10);???
  • ???
  • ????private?static?final?ThreadFactory?sThreadFactory?=?new?ThreadFactory()?{???
  • ????????private?final?AtomicInteger?mCount?=?new?AtomicInteger(1);???
  • ???
  • ????????public?Thread?newThread(Runnable?r)?{???
  • ????????????return?new?Thread(r,?"AsyncTask?#"?+?mCount.getAndIncrement());???
  • ????????}???
  • ????};???
  • ???
  • ????......???
  • ???
  • ????private?static?final?ThreadPoolExecutor?sExecutor?=?new?ThreadPoolExecutor(CORE_POOL_SIZE,???
  • ????????MAXIMUM_POOL_SIZE,?KEEP_ALIVE,?TimeUnit.SECONDS,?sWorkQueue,?sThreadFactory);???
  • ???
  • ????private?static?final?int?MESSAGE_POST_RESULT?=?0x1;???
  • ????private?static?final?int?MESSAGE_POST_PROGRESS?=?0x2;???
  • ????private?static?final?int?MESSAGE_POST_CANCEL?=?0x3;???
  • ???
  • ????private?static?final?InternalHandler?sHandler?=?new?InternalHandler();???
  • ???
  • ????private?final?WorkerRunnable<Params,?Result>?mWorker;???
  • ????private?final?FutureTask<Result>?mFuture;???
  • ???
  • ????......???
  • ???
  • ????public?AsyncTask()?{???
  • ????????mWorker?=?new?WorkerRunnable<Params,?Result>()?{???
  • ????????????public?Result?call()?throws?Exception?{???
  • ????????????????......???
  • ????????????????return?doInBackground(mParams);???
  • ????????????}???
  • ????????};???
  • ???
  • ????????mFuture?=?new?FutureTask<Result>(mWorker)?{???
  • ????????????@Override???
  • ????????????protected?void?done()?{???
  • ????????????????Message?message;???
  • ????????????????Result?result?=?null;???
  • ???
  • ????????????????try?{???
  • ????????????????????result?=?get();???
  • ????????????????}?catch?(InterruptedException?e)?{???
  • ????????????????????android.util.Log.w(LOG_TAG,?e);???
  • ????????????????}?catch?(ExecutionException?e)?{???
  • ????????????????????throw?new?RuntimeException("An?error?occured?while?executing?doInBackground()",???
  • ????????????????????????e.getCause());???
  • ????????????????}?catch?(CancellationException?e)?{???
  • ????????????????????message?=?sHandler.obtainMessage(MESSAGE_POST_CANCEL,???
  • ????????????????????????new?AsyncTaskResult<Result>(AsyncTask.this,?(Result[])?null));???
  • ????????????????????message.sendToTarget();???
  • ????????????????????return;???
  • ????????????????}?catch?(Throwable?t)?{???
  • ????????????????????throw?new?RuntimeException("An?error?occured?while?executing?"???
  • ????????????????????????+?"doInBackground()",?t);???
  • ????????????????}???
  • ???
  • ????????????????message?=?sHandler.obtainMessage(MESSAGE_POST_RESULT,???
  • ????????????????????new?AsyncTaskResult<Result>(AsyncTask.this,?result));???
  • ????????????????message.sendToTarget();???
  • ????????????}???
  • ????????};???
  • ????}???
  • ???
  • ????......???
  • ???
  • ????public?final?Result?get()?throws?InterruptedException,?ExecutionException?{???
  • ????????return?mFuture.get();???
  • ????}???
  • ???
  • ????......???
  • ???
  • ????public?final?AsyncTask<Params,?Progress,?Result>?execute(Params...?params)?{???
  • ????????......???
  • ???
  • ????????mWorker.mParams?=?params;???
  • ????????sExecutor.execute(mFuture);???
  • ???
  • ????????return?this;???
  • ????}???
  • ???
  • ????......???
  • ???
  • ????protected?final?void?publishProgress(Progress...?values)?{???
  • ????????sHandler.obtainMessage(MESSAGE_POST_PROGRESS,???
  • ????????????new?AsyncTaskResult<Progress>(this,?values)).sendToTarget();???
  • ????}???
  • ???
  • ????????private?void?finish(Result?result)?{???
  • ????????????????......???
  • ????????????????onPostExecute(result);???
  • ????????????????......???
  • ????????}???
  • ???
  • ????......???
  • ???
  • ????private?static?class?InternalHandler?extends?Handler?{???
  • ????????@SuppressWarnings({"unchecked",?"RawUseOfParameterizedType"})???
  • ????????@Override???
  • ????????public?void?handleMessage(Message?msg)?{???
  • ????????????AsyncTaskResult?result?=?(AsyncTaskResult)?msg.obj;???
  • ????????????switch?(msg.what)?{???
  • ????????????????case?MESSAGE_POST_RESULT:???
  • ?????????????????//?There?is?only?one?result???
  • ?????????????????result.mTask.finish(result.mData[0]);???
  • ?????????????????break;???
  • ????????????????case?MESSAGE_POST_PROGRESS:???
  • ?????????????????result.mTask.onProgressUpdate(result.mData);???
  • ?????????????????break;???
  • ????????????????case?MESSAGE_POST_CANCEL:???
  • ?????????????????result.mTask.onCancelled();???
  • ?????????????????break;???
  • ????????????}???
  • ????????}???
  • ????}???
  • ???
  • ????private?static?abstract?class?WorkerRunnable<Params,?Result>?implements?Callable<Result>?{???
  • ????????Params[]?mParams;???
  • ????}???
  • ???
  • ????private?static?class?AsyncTaskResult<Data>?{???
  • ????????final?AsyncTask?mTask;???
  • ????????final?Data[]?mData;???
  • ???
  • ????????AsyncTaskResult(AsyncTask?task,?Data...?data)?{???
  • ????????????mTask?=?task;???
  • ????????????mData?=?data;???
  • ????????}???
  • ????}???
  • }???
  • 轉載于:https://blog.51cto.com/shyluo/966885

    總結

    以上是生活随笔為你收集整理的Android应用程序线程消息循环模型分析(4)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。