由淺入深研究Android(2)--好吧,我是一個main方法
好吧,我是一個main方法,一個簡簡單單的main方法。但是你確定你真的了解我嗎?
1.為啥要有main方法
為啥要有mian函數?假設你寫了一大堆程序,當你要運行時你會你怎樣讓系統知道,你的程序是從start()方法開始執行,還是run()方法開始執行??系統不會知道你的想法,所以為了規范,也就有了main函數。
就像開車一樣,你們約定好我踩油門就是加速,踩剎車就是剎車,如果你買了輛汽車沒有油門,那你就在那郁悶哇。
就像上述例子,系統會告訴你,我只會從你的main函數開始執行(踩油門)。因為系統需要一個程序入口。但是我們又想起在Dos的時候我們為了確定IP配置是否錯誤,往往會用到這個命令ipconfig -all;為了接收后面的-all命令不同的語言采用了不同的方法。
Java的入口與參數 |
public static void main(String[] args) { } |
C ++中的入口與參數 |
int main( int argc, char *argv[]) //argc // 程序參數的個數 //argv[]// 實參(從程序名開始,以null結束)
|
|
但是是不是所有語言都是有main函數開始的呢?不是,有的系統把main函數封裝到其內部的容器里了,所以我們在用servlet的時候程序的入口在doGet()和doPost ()函數處。
對servlet系統來說,他們約定好了要從doGet()和doPost ()方法出調用。同樣我們開發Android的時候Activity的入口就是onCreate()當然這是對於不去深入系統時,我們所看到的入口,也就是Android系統為我們提供的入口,但是其實其不能算是一個入口,其只能算是一個系統回調。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } |
總結:
·main函數是程序體和執行程序的系統約定的一個入口。
·對於不同的系統會擁有不同的入口函數。
2.進程和線程
進程是應用程序的執行實例,線程是進程內的執行路徑。啟動“記事本”時,操作系統創建進程並開始執行該進程的主線程。此線程終止時,進程也終止。
那么什么是主線程了?其實我們開始了執行一個main函數時,就是開啟了一個主線程。我們來看一個例子:
子線程 |
/** * 子線程,這是一個子線程 * */ class SubClass implements Runnable { public void run() { for(int i = 0; i < 1000; i ++) { System.out.println("sub thread " + i); } } } |
主線程 |
/** * 主線程 * */ public class MainThread { public static void main(String[] args) { Thread mThread = new Thread(new SubClass()); mThread.start(); for(int i = 0; i < 100; i ++) { System.out.println("main thread " + i); } } } |
運行后我們可以發現主線程和子線程是交替出現的:
main thread 36
sub thread 7
main thread 37
sub thread 8
main thread 38
sub thread 9
main thread 39
這里給大家所以下守護線程是啥:守護線程就是伴隨着主線程的線程。這是啥意思了,其實很好理解,就是伴隨着主線程結束而結束的線程。
我們做個實驗:
將子線程中的循環改為10000次,並設置mThread為守護線程:
Thread mThread = new Thread(new SubClass()); // 設置mThread是守護線程 mThread.setDaemon(true); mThread.start(); |
運行后發現主線程結束后,守護線程也結束了。有興趣的可以試一下。
總結:
·main函數是一個線程,並且是主線程。
·守護線程是主線程結束而結束的線程。
3.回調(callback)
如果前面看過我博客的一定對onDraw()方法很熟悉吧,為什么我們繼承了View之后,重寫這個方法會繪制出圖像了,因為這是一個系統的回調方法。
就像main函數一樣,系統要啟動主線程會調用main函數,那么Android系統要在屏幕上繪制圖像,他就會調用當前顯示View的onDrwa()方法。所以我們在重寫了這個方法后,系統就可以通過這個方法繪制東西了。
在Android的系統里,我們會經常遇到一些回調接口: Window.Callback
HandlerCaller.Callback, KeyEvent.Callback, ComponentCallbacks...關於回調接口,我們會在后面講解。
后面我們會通過一個小例子,來看看利用回調方法來實現Android組件的重用。
總結:
·main函數是一個回調
·onDraw方法也是一個回調
·其實系統中好多東西都可以通過回調實現。
本系列專題屬於繁星皓月個人所有,歡迎轉載,但需注明原文地址