Android应用程序线程消息循环模型分析(4)
生活随笔
收集整理的這篇文章主要介紹了
Android应用程序线程消息循环模型分析(4)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
接下來(lái)我們?cè)倏纯磻?yīng)用程序的配置文件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>??? 這個(gè)配置文件很簡(jiǎn)單,我們就不介紹了。 再來(lái)看應(yīng)用程序的界面文件,它定義在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>???? 這個(gè)界面配置文件也很簡(jiǎn)單,等一下我們?cè)谀M器把這個(gè)應(yīng)用程序啟動(dòng)起來(lái)后,就可以看到它的截圖了。應(yīng)用程序用到的字符串資源文件位于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>???? 最后,我們還要在工程目錄下放置一個(gè)編譯腳本文件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)????? 接下來(lái)就要編譯了。有關(guān)如何單獨(dú)編譯Android源代碼工程的模塊,以及如何打包system.img,請(qǐng)參考如何單獨(dú)編譯Android源代碼中的模塊一文。 執(zhí)行以下命令進(jìn)行編譯和打包: USER-NAME@MACHINE-NAME:~/Android$?mmm?packages/experimental/Counter????????????? USER-NAME@MACHINE-NAME:~/Android$?make?snod??? 這樣,打包好的Android系統(tǒng)鏡像文件system.img就包含我們前面創(chuàng)建的Counter應(yīng)用程序了。
?? ? ? 再接下來(lái),就是運(yùn)行模擬器來(lái)運(yùn)行我們的例子了。關(guān)于如何在Android源代碼工程中運(yùn)行模擬器,請(qǐng)參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。 ? ? ? ?執(zhí)行以下命令啟動(dòng)模擬器:USER-NAME@MACHINE-NAME:~/Android$?emulator???? ?最后我們就可以在Launcher中找到Counter應(yīng)用程序圖標(biāo),把它啟動(dòng)起來(lái),點(diǎn)擊Start按鈕,就會(huì)看到應(yīng)用程序界面上的計(jì)數(shù)器跑起來(lái)了: ?這樣,使用AsyncTask的例子就介紹完了,下面,我們就要根據(jù)上面對(duì)AsyncTask的使用情況來(lái)重點(diǎn)分析它的實(shí)現(xiàn)了。
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;??? ????????}??? ????}??? }???
?? ? ? 再接下來(lái),就是運(yùn)行模擬器來(lái)運(yùn)行我們的例子了。關(guān)于如何在Android源代碼工程中運(yùn)行模擬器,請(qǐng)參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。 ? ? ? ?執(zhí)行以下命令啟動(dòng)模擬器:
AsyncTask類定義在frameworks/base/core/java/android/os/AsyncTask.java文件中:
轉(zhuǎn)載于:https://blog.51cto.com/shyluo/966885
總結(jié)
以上是生活随笔為你收集整理的Android应用程序线程消息循环模型分析(4)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《Windows Forms编程》,真正
- 下一篇: 自定义光标样式