2013-06-06 14 views
1

我在Samsung Galaxy Nexus上使用Android進行一些OpenGL ES 2.0編碼。在Android中將消息從GLSurfaceView傳遞給MainActivity的最佳實踐?

我已經根據Android OpenGL教程實現了MyRenderer類,但我希望能夠將一些調試信息返回給MainActivity,例如,如果着色器編譯器失敗,則會顯示錯誤消息。不幸的是,我試圖將錯誤信息返回到主要活動的所有方法都失敗了。

起初我只是想讓渲染類本身彈出一個AlertDialogBu​​ilder類的警告對話框,但由於GLSurfaceView.renderer不是正確的類型,所以顯然不起作用。由於GLSurfaceView.renderer不是一項活動,我也無法生成顯示信息的活動。

我的做法則是讓我的MainActivity實現所謂AlertReporter一個接口,只有一個方法:

public interface AlertCallback { 
    void alertAndDie(String alertString);  
} 

我實現的方法在我的MainActivity,但每當我有方法做任何事情(產卵一個警告框,創建一個新的文本框活動等...)該程序崩潰。我假設(並可能是錯誤的),這是因爲我從渲染線程調用MainActivity中的方法(創建我的渲染器時GLSurfaceView產生的)。

長話短說,我的問題是這樣的: 將此錯誤信息返回給MainActivity線程以便我可以顯示它的最佳做法是什麼?

作爲一個側面的問題,渲染器中的onCreateSurface方法甚至是處理我的所有openGL初始化(如着色器編譯)的最佳位置?

+0

您應該使用登錄logcat的 – JRowan

+0

你也可以使用一個處理程序中斷glthread – JRowan

回答

0

您可以輕鬆地使用日誌類調試信息

Log.d("FPSCounter", "fps: " + frames); 

Android的UI組件,你將不得不作出一個處理程序中斷glthread正確巫婆就是爲什麼你崩潰,我說用原木不過,因爲這將是最佳做法

+0

感謝您的幫助。我使用記錄器,但我碰到glGetShaderInfoLog返回空字符串錯誤,即使在Android 4.2中顯然仍然活着... :( – stix

+0

我從未使用shaderlog之前,我不知道那 – JRowan

0

這是我用來做類似事情的方法。我使用全局變量來保存在Activity類中創建的TextView的句柄。通過從Activity類調用渲染類來分配全局。

代碼中呈現類:

private static TextView glbTv1 = null; 

public void assignTextviewGlobalHandles(TextView tv1){ 
    glbTv1 = tv1; 

} 

public void mycallbacktomainactivitymehod(){ 

    if(glbTv1 !=null){ 
     final myMainActivity activity=(myMainActivity) this.context; 
     activity.runOnUiThread(new Runnable() { 
      public void run() 
       { 
       //glbTv1 is assigned through a TextView varaible created in the Activity class, by making a call into the render class. 
       glbTv1.setText(String.valueOf(f_jetPos)); 
       } 
     }); 
    } 
} 
+0

你怎麼能打電話給來自活動課的渲染? –

相關問題