由淺入深研究Android(2)--好吧,我是一個main方法


由淺入深研究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系統要在屏幕上繪制圖像,他就會調用當前顯示ViewonDrwa()方法。所以我們在重寫了這個方法后,系統就可以通過這個方法繪制東西了。

Android的系統里,我們會經常遇到一些回調接口: Window.Callback

HandlerCaller.Callback, KeyEvent.Callback, ComponentCallbacks...關於回調接口,我們會在后面講解。

    后面我們會通過一個小例子,來看看利用回調方法來實現Android組件的重用。

    總結:

       ·main函數是一個回調

      ·onDraw方法也是一個回調

      ·其實系統中好多東西都可以通過回調實現。

 

 

本系列專題屬於繁星皓月個人所有,歡迎轉載,但需注明原文地址

http://www.cnblogs.com/lovewf/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM