2011-03-08 33 views
6

我想在選擇菜單項時調用GLES20方法。從Android上的主線程使用OpenGL

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.clear: 
      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
      break; 
     // ... 
    } 
} 

這不工作,因爲我在main線程,而不是在GLThread。它說:(記錄一次每個線程)

調用OpenGL ES的API目前不 方面

但是我必須做的事情的工作?

回答

14

我發現我自己的答案:

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.clear: 
      // GLSurfaceView.queueEvent 
      surface.queueEvent(new Runnable() { 
       @Override 
       public void run() { 
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
       } 
      }); 
      break; 
     // ... 
    } 
} 
+0

喜馬賽厄斯,我得到的Android 3.2.Could告訴你,當你與你的應用程序面臨過這樣的錯誤相同的錯誤? – 2011-09-28 14:02:24

+0

@RunO OpenGL和主應用程序在不同的線程中運行。因此你不能從主線程執行OpenGL命令(見源代碼)。因此,在主線程中,您必須將此命令排隊到OpenGL線程(請參閱我的答案中的源代碼)。我希望這有幫助。否則,開始一個新問題,描述你的問題,在評論中給我一個鏈接,我會看看我能做些什麼。 – Matthias 2011-09-28 15:25:59

+0

@Matthias非常感謝 – 2017-05-30 15:46:40