zygote&AsyncTaskのdoInBackgroudメソッド

1844 ワード

zygoteは時々zygoteに関する新聞の間違いに遭遇します.これは何ですか.簡単に理解すると孵化池です.新しいプロセスごとに仮想マシンの新しいインスタンスが起動すると、必要なベースクラスがすべてロードされるたびに効率が低下します.Androidは各アプリケーションを独立したプロセスに配置し、下位linuxオペレーティングシステムのfork操作を利用して、テンプレートプロセスを通じて新しいプロセスを生成します.このプロセスは新しい仮想マシンインスタンスを起動するときに最適な状態に達することができます.このテンプレートプロセスの名前はzygoteです.zygoteテンプレートプロセスはdalvik仮想マシンの一例であり、fork操作によってzygoteのコピーを生成するプリロードクラスおよびzygoteプロセスの他の方法のセットを含む.
AsyncTaskは、数秒などの非生産的なタスクを実行するのに適しており、数分以上のプロセスを実行するのに適していません.タスクを生成するatyにはライフサイクルがあるため、AsyncTaskを生成して電話に出た場合、atyが破棄されたことに気づく可能性があります.
AsyncTaskのdoInBackgroudメソッドは、別のスレッドで実行されているため、役割ドメイン内の変数のみを参照できます.これにより、スレッドは安全です.次は誤った使い方です.
//.... some class 
int mCount;
public void initButton1(Button button){
mCount = 0;
button.setOnClickListener(){
@SuppressWarnings("unchecked")
@override
public void onClick(View v){
@override
protected void doInBackground(Void...args){
mCount++;//!!!!not thread safe
return null;
}
}.execute();
}
});
}

Android uiは、uiのタイムリーな応答を保証するために、数ミリ秒を超える時間を費やしたり、数百件の命令を必要としたりする単一スレッドのタスクであり、メインスレッドで操作すべきではありません.AsyncTaskはタスクを実行するのは簡単ですが、doInBackgroundは別のスレッドです.他のスレッドが表示されている状態も、他のスレッドが書き込み可能な状態も読めません.これには、そのパラメータも含まれます.変更できないオブジェクトは、同時スレッド間で情報を伝達する重要なツールです.