2015-12-13 32 views
0

所以我有一個在視圖內實例化的線程。該線程應該調用postInvalidate()每16毫秒(60fps)重新繪製屏幕。雖然屏幕從不重繪。它只是空白。我究竟做錯了什麼?代碼如下:在線程中每X秒失效

public class DrawingView extends View { 
    private Paint paint; 
    private GraphicsLoop gThread; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     paint = new Paint(); 
     gThread = new GraphicsLoop(); 
     gThread.start(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // Draw Stuff 
    } 
} 

主題:

public class GraphicsLoop extends Thread { 
     private long frameTime; 

     GraphicsLoop(){ 
     } 

     @Override 
     public void run() { 
      while(true) { 
       long frameTimeDelta = System.currentTimeMillis() - frameTime; 
       if (frameTimeDelta > 16) { 
        frameTime = System.currentTimeMillis(); 
        postInvalidate(); 
       } 
      } 
     } 

     @Override 
     public void start() 
     { 
      frameTime = System.currentTimeMillis(); 
     } 
    } 
+0

你是否假設每個循環執行需要1 ms? –

+0

我想這個問題是因爲你的16毫秒的高度難以分辨的時間..試着用5秒左右,看看你是否仍然面臨問題.. – hagrawal

+0

更改時間值並沒有什麼區別。 – mstagg

回答

1

你錯過了在重寫start()方法super.start()來電GraphicsLoop,因此線程永遠不會啓動。

+0

就是這樣。非常感謝! – mstagg

+0

這可能已經解決了您的問題,但我認爲您還有很多其他問題,最重要的是您使用的是WHILE循環,它會像任何情況一樣提高CPU利用率。閱讀爲什麼不使用WHILE循環來重複執行任務。實際上,您應該使用Java的構建來支持這些重複性任務 - 閱讀本文http://stackoverflow.com/questions/12908412/print-hello-world-every-x-seconds,由@Tim Bender回答 – hagrawal