編輯:關於Android編程
最近看了一些開發人員做的APP開發,雖然都實現了比較完美的功能,不過很多地方很是牽強!我覺得:作為一個合格軟件工程師,最重要的不是你寫過多少代碼,而是你研究過多少代碼!所以,我更倡導多研究系統原本定制的一些APP,不然自己開發的時候會有很多雷區!
今天,我們先說一個無處不在的函數:onCreate().。我們看看gogle是怎麼解釋他的:
Called when the activity is first created. This is where you should do all of your normal static set up: create views, bind data to lists, etc. This method also provides you with a Bundle containing the activity's previously frozen state, if there was one.
Always followed by onStart()
.
normal:常規的、通常的、一般的 。
static:靜態的,不變的。
說的是:在這裡我們需要做通常需要配置的信息,而不是真的所有的事情都在這裡做。我們知道,一個activity啟動回調的第一個函數就是onCreate。這個函數主要做這個activity啟動的一些必要的初始化的工作,這個函數調用完後,這個activity並不是說就已經啟動了,或者是跳到前台了。而是還需要其他的大量工作,我們知道:onCreate之後調用了還有onRestart()和onStart()等,實際上onStart()調用完畢了這個activity還沒有完全啟動,也只是前台可見,直到 onResume()
後這個onCreate才算終於啟動。既然這樣,那麼在一個activity真正啟動之前任何相當耗時的動作都會導致activity啟動緩慢,特別是在onCreate裡面耗時長的話可能照成嚴重的體驗效果。
我們來先看一個實例:
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); mContext = this; setContentView(R.layout.main); dataLoad = new DataLoading(); mScrollLayout = (ScrollLayout)findViewById(R.id.ScrollLayoutTest); btnExit = (ImageButton)findViewById(R.id.btn_exit); btnExit.setOnClickListener(btnExitClickListener); btnContacts = (ImageButton)findViewById(R.id.btn_contacts); btnContacts.setOnClickListener(btnContactsClickListener); mSpeedDailDataMgr = new SpeedDailMgr(this); loadGripView(); //in MTK //mCallOptionHandler = new CallOptionHandler(this); mCallOptionHandler = new ContactsCallOptionHandler(this, new ContactsCallOptionHandlerFactory()); //don't consider getting no data, ex: when starting up updateEnabledCard(); }
這是一個APP的一個Activity的onCreate的寫法。其實這段代碼沒有什麼問題,而且看起來也是比較簡單的代碼。不過裡面大量危險的代碼段:不管是dataLoad = new DataLoading(); 還是 mSpeedDailDataMgr = new SpeedDailMgr(this);更或者是loadGripView();甚至updateEnabledCard();這麼危險的處理都是不應該在這裡來處理的。這裡包含了加載數據庫數據、讀取文件信息、讀取SIM卡信息,這些操作都是有可能跳出異常的,而且其操作耗時也是不確定的!對於面對這樣問題,我覺得應該注意下面幾個方面:
(1)在Activity啟動前,盡量少做。
(2)對於布局比較復雜的時候,可以考慮不要一次性全部加載上,動態加載是一個好的辦法。
(3)對於及時需要的數據,加載起來耗時的又有異常危險的,一定記得開辟一個線程來做這些動作,千萬記得不要做阻塞主線程(UI線程)的任何事情。
(4)對於特殊情況下,Activity啟動確實需要大量工作時候,可以考慮先加載一個簡單的布局(或是Activity)來過渡.。
(5)所有的目的都是讓你要啟動的組件盡快上場,而不是以畫好妝為主,這樣的話客人會等不及的,這個社會客戶才是上帝。
一、onWindowFocusChanged有時我們需要測量一個Activity多長時間才能顯示出來,那麼在代碼中打點計時的時機選在哪兒呢?在onCreate和onRes
很久以前寫過兩篇Fragment的介紹,主要就是介紹其功能:Android Fragment 真正的完全解析(上)和Android Fragment 真正的
Android NougatAndroid 7.0 經過5個開發者預覽版本的改善,終於在8.22日正式推送,並確定版本名為Nougat(牛軋糖)根據官方的介紹,Andro
好久沒更新過博客了。這段時間總算是忙完了,抽點時間出來更新下博客。這次跟大家帶來的是一個很簡單的短信驗證碼。相信這個驗證碼的功能基本上99的項目都需要用到,我這裡是用的雲