有人可以解釋什麼是在這裏發生什麼線程被阻止?此處的線程對象用於畫布和繪圖圖形,因此將在此圖形線程上調用join()方法,以便它繼續完成。而另一個線程被阻塞並等待。哪個線程是這個?哪個線程被阻塞等待線程連接()在SurfaceView的這個簡短示例中完成?
如果surfaceView類在主UI線程上運行,那麼UI將被阻塞,等待圖形線程完成。這根本不符合邏輯。所以其他的解釋是在這裏有三個獨立的線程。主要的UI線程,join()被調用的圖形線程,以及第三個用於表面視圖的線程在圖形線程結束時被阻塞
實際上有三個線程在運行,而UI線程是不是被阻止的人?
無處在我的代碼中,我是否爲SurfaceView啓動了一個新線程。我只實例化了一個SurfaceView對象。
隨着代碼的寫入,看起來主UI線程被阻塞,等待圖形線程完成。
如果SurfaceView對象在線程或AsyncTask內部實例化,那麼它看起來更清晰。
//此代碼位於SurfaceView類
@Override
public void surfaceCreated(SurfaceHolder holder) {
// can also put this code in surfaceChanged
running = true;
thread = new Thread(surfaceRunnable);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
running = false;
boolean retry = true;
while(retry) {
try {
thread.join();
retry = false;
} catch(InterruptedException e) {
}
}
執行'thread.join()'的線程是被阻塞的線程,而不是'thread'表示的線程。 –
是否意味着surfaceDestoryed被後臺線程調用,而不是主UI線程? – Kevik
如果將日誌消息添加到某些代碼('surfaceCreated()','surfaceDestroyed()','surfaceRunnable.run()',然後使用'adb logcat -v threadtime'查看logcat輸出,則可以看到日誌消息旁邊的線程ID,這使得將活動映射到特定線程變得很容易。更好的辦法是附上一個調試器,然後看看所有的線程是什麼以及每個線程停止了什麼 - 然後你就會知道不僅是什麼,而且是爲什麼。 – fadden