私はSurfaceViewの拡張機能を持っていますが、その裸の骨はLunar Landerのように実装されています。null SurfaceViewスレッドのキャンバスが停止しているにも関わらず、surfaceDestroyed()のスレッドはAndroid 4/ICSでのみ
public void run() {
while (mRun) {
Canvas c;
try {
c = mSurfaceHolder.lockCanvas();
synchronized (mSurfaceHolder) {
doDraw(c); // Main drawing method - not included in this code snippet
}
}
finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
そしてThread
は適切に表面が破壊されたときに停止されています:それは、図面Thread
のrun()
方法は、本質的である、私は通常、現在までにテストしているデバイスでは
public void surfaceDestroyed(SurfaceHolder holder) {
// we have to tell thread to shut down & wait for it to finish, or else
// it might touch the Surface after we return and explode
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
}
catch (InterruptedException e) {
}
}
}
(HTC Desire、Desire HD、Archos 101の間ではOS 2.2と2.3.3があります)、上記の問題は一度もありませんでした。つまり、ユーザがActivity
を撤回したためにサーフェスが破棄されたり、Activity
が呼び出されたりすると、のコードは、null
を返すように常にmSurfaceHolder.lockCanvas()
が呼び出されないようにします。
私はアンドロイド4/ICSを実行している私の新しいHTCワンX上で見つけた違いは、しかし、方法surfaceDestroyed()
の呼び出し(そのメソッド内すなわちコードがまだ実行されている)の間に私の描画Thread
が与えられるだろうということですnull
キャンバスmSurfaceHolder.lockCanvas()
です。もちろん、これはアプリケーションクラッシュを引き起こします。私の一つのXで、これは表面が破壊されごと単一の時間起こるのだろう - などそれはActivity
のバックアウト、電話を回転さに起因するものかどうかを、
私は下にあったので、私はこのことについて困惑しています印象はmSurfaceHolder.lockCanvas()
はnull
Canvas
surfaceDestroyed()
まで実際にはから出てになるはずです。確かに、これはjavadocはこう言われる、今の
This is called immediately before a surface is being destroyed. After returning from this call, you should no longer try to access this surface. If you have a rendering thread that directly accesses the surface, you must ensure that thread is no longer touching the Surface before returning from this function.
私のソリューションは、ちょうどnull
をチェックすることです。これは正常に動作します:
if(c != null){
doDraw(c); // Main drawing method - not included in this code snippet
}
しかし、私は突然のAndroid 4/ICSのためにこれを行うために抱えている理由を任意のアイデア?
ヌルを返すことは、表面に触れないようにするための方法です。そうすれば、うまくいくはずです。 Idkなぜ、または基本的な実装で変更されたか。 – zapl
ありがとう、zapl。ええ、それは本当に奇妙です。この実装の明らかな変化を引き起こすために私がやっているどこかで奇妙なことがない限り、確かにSurfaceViewベースのアプリの多くはICSで死ぬだろう。 – Trevor
ICSデバイスやエミュレータでもこのエラーが発生したため、誰も「正式な」理由がわかりません。 – Lenciel