zygote&AsyncTask的doInBackgroud方法

来源:互联网 发布:文件上传webshell漏洞 编辑:程序博客网 时间:2024/06/11 03:09

zygote
有时候会遇到报有关zygote的错,这是个什么东西呢,简单理解就是孵化池。
当每个新的进程启动虚拟机的一个新的实例时,如果每次都加载所有必要的基类,则效率会很低。android把每个应用放在独立的进程中,他会利用底层linux操作系统的fork操作,通过模板进程生成新的进程,该进程在启动新的虚拟机实例时能够达到最优状态,该模板进程的名字就是zygote。zygote模板进程是dalvik虚拟机的一个实例,它包含一组预加载类及zygote进程的其他方法,这些进程通过fork操作生成zygote的副本。

AsyncTask适合运行历时非产短的任务,比如几秒钟,不适合历时数分钟或者更长的进程。因为生成任务的aty有生命周期,如果产生AsyncTask后接了个电话,可能会发现aty已被销毁

AsyncTask的doInBackgroud方法,因为他是在另一个线程执行的,只能引用作用域内的变量,这样才是线程安全的,下面是个错误的用法:

//.... some class int mCount;public void initButton1(Button button){mCount = 0;button.setOnClickListener(){@SuppressWarnings("unchecked")@overridepublic void onClick(View v){@overrideprotected void doInBackground(Void...args){mCount++;//!!!!not thread safereturn null;}}.execute();}});}

android ui是单线程的
为了保证ui的及时响应,耗时超过几毫秒或者需要好几百条指令的任务都不应该在主线程操作。
AsyncTask运行任务简单,但是doInBackground是在另一个线程。不能写任何其他线程可见的状态,也不能读任何其他线程可写的状态。这也包括其参数。
不可改变的对象是在并发线程之间传递信息的重要工具。

1 0