由浅入深研究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系统要在屏幕上绘制图像,他就会调用当前显示View的onDrwa()方法。所以我们在重写了这个方法后,系统就可以通过这个方法绘制东西了。
在Android的系统里,我们会经常遇到一些回调接口: Window.Callback
HandlerCaller.Callback, KeyEvent.Callback, ComponentCallbacks...关于回调接口,我们会在后面讲解。
后面我们会通过一个小例子,来看看利用回调方法来实现Android组件的重用。
总结:
·main函数是一个回调
·onDraw方法也是一个回调
·其实系统中好多东西都可以通过回调实现。
本系列专题属于繁星皓月个人所有,欢迎转载,但需注明原文地址