1

嘿,大家我對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(); 
    } 
} 
+0

你如何關閉你的應用程序?當LiveCard取消發佈時,樣本的呈現線程會被終止:這隻發生在Service停止時。 – Alain

+0

礦不。例如谷歌秒錶示例,我在繪製(視圖視圖)函數中放置了一條日誌消息,甚至在我使用菜單選項「停止」關閉應用程序之後。日誌消息繼續在LogCat中進行。並且SurfaceDestroyed(SurfaceHolder持有者)中的日誌消息從未被稱爲 –

+0

嗡嗡聲,這看起來像一個bug ...另一種可以阻止渲染線程的方式是在調用服務的onDestroyed方法時手動調用onSurfaceDestroyed 。 – Alain

回答

1

它看起來像蟲子在這裏,裏面onDestroy

if (mLiveCard != null && mLiveCard.isPublished()) { 
    if (mLiveCardRender != null) { 
     mLiveCard.getSurfaceHolder().removeCallback(mLiveCardRender); 
    } 
    mLiveCard.unpublish(); 

通過unpublish之前移除回調方法被調用時,系統不再知道當卡片被移除後,其方法調用的方法是什麼surfaceDestroyed。您實際上可以完全刪除對removeCallback的呼叫;這是沒有必要的。

看起來這是我們的一些樣本中的一個錯誤,我們錯過了我們的API進化。感謝您的支持,我們會盡快更新它們!

+0

太棒了!去玻璃隊去! –