嘿,大家我對android/glass開發相當新,所以如果我錯了,請糾正我。Android /玻璃:如何觸發surfaceDestroyed
我試圖創建一個很好的高頻實時卡。但是,當我關閉應用程序時,函數surfaceDestroyed()沒有得到觸發器,並且thread.quit()沒有被調用。
我試圖尋找示例項目秒錶/計時器,顯然他們並沒有停止線程以及。根據文件,SurfaceDestroyed在表面被摧毀之前被調用,但是我的表面是什麼?我也讀過一些叫Surfaceview的東西,它們是一樣的東西嗎? surfaceview我的customview或livecard?
https://developers.google.com/glass/develop/gdk/ui/live-cards#creating_high-frequency_live_cards
感謝任何形式的幫助!
/ ***
* LiveCardRender Class
***/
public class LiveCardRender implements DirectRenderingCallback {
private static final long FRAME_TIME_MILLIS = 33;
private CustomView mCustomView;
private SurfaceHolder mHolder;
private boolean mPaused;
private RenderThread mRenderThread;
private class RenderThread extends Thread {
private boolean mShouldRun;
public RenderThread() {
mShouldRun = true;
}
private synchronized boolean shouldRun() {
return mShouldRun;
}
public synchronized void quit() {
mShouldRun = false;
}
@Override
public void run() {
while (shouldRun()) {
draw(mCustomView);
SystemClock.sleep(FRAME_TIME_MILLIS);
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mHolder = holder;
updateRendering();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mHolder = null;
updateRendering();
}
@Override
public void renderingPaused(SurfaceHolder holder, boolean paused) {
mPaused = paused;
updateRendering();
}
private synchronized void updateRendering() {
boolean shouldRender = (mHolder != null) && !mPaused;
boolean rendering = mRenderThread != null;
if (shouldRender != rendering) {
if (shouldRender) {
mRenderThread = new RenderThread();
mRenderThread.start();
} else {
mRenderThread.quit();
mRenderThread = null;
}
}
}
private void draw(View view) {
Canvas canvas;
try {
canvas = mHolder.lockCanvas();
} catch (Exception e) {
return;
}
if (canvas != null) {
view.draw(canvas);
mHolder.unlockCanvasAndPost(canvas);
}
}
}
/***
* LaunchService Class that uses LiveCardRender to update the live card
***/
public class LaunchService extends Service {
private static final String LIVE_CARD_TAG = "motion_card";
private TimelineManager mTimelineManager;
private LiveCard mLiveCard;
private LiveCardRender mLiveCardRender;
@Override
public void onCreate() {
mTimelineManager = TimelineManager.from(this);
}
public int onStartCommand(Intent intent, int flags, int startId) {
if (mLiveCard == null) {
mLiveCard = mTimelineManager.createLiveCard(LIVE_CARD_TAG);
mLiveCardRender = new LiveCardRender(this);
mLiveCard.setDirectRenderingEnabled(true);
mLiveCard.getSurfaceHolder().addCallback(mLiveCardRender);
mLiveCard.publish(PublishMode.REVEAL);
}
return START_STICKY;
}
@Override
public void onDestroy(){
if (mLiveCard != null && mLiveCard.isPublished()) {
if (mLiveCardRender != null) {
mLiveCard.getSurfaceHolder().removeCallback(mLiveCardRender);
}
mLiveCard.unpublish();
mLiveCard = null;
}
super.onDestroy();
}
}
你如何關閉你的應用程序?當LiveCard取消發佈時,樣本的呈現線程會被終止:這隻發生在Service停止時。 – Alain
礦不。例如谷歌秒錶示例,我在繪製(視圖視圖)函數中放置了一條日誌消息,甚至在我使用菜單選項「停止」關閉應用程序之後。日誌消息繼續在LogCat中進行。並且SurfaceDestroyed(SurfaceHolder持有者)中的日誌消息從未被稱爲 –
嗡嗡聲,這看起來像一個bug ...另一種可以阻止渲染線程的方式是在調用服務的onDestroyed方法時手動調用onSurfaceDestroyed 。 – Alain