2010-07-19 119 views
0

我正試圖調用一個方法,該方法在我正在從openGL線程中工作的類之外,但是我得到一個Can't create handler inside thread that has not called Looper.prepare()運行時異常。有沒有人知道一種解決方法,而不是將 方法放在同一個類中?從openGL類中調用外部方法

程序中斷@Extract cam = new Extract();

 public void onDrawFrame(GL10 gl) { 
    onDrawFrameCounter++; 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    bindCameraTexture(gl); 
    System.out.println(Global.bearing); 
    float bear = Global.bearing; 
    gl.glLoadIdentity(); 
    gl.glNormal3f(0,0,1); 
    System.out.println("ARRAY!: " + GLCamTest.array.length); 
    p = 0; 
    gl.glRotatef(bear, 1, 0, 0); 
    int q = 0; 
    int e = 0; 
    if(q < Global.cubes){ 

       Extract cam = new Extract(); 
       Bitmap image = cam.extractimage(q); 
       final int TILE_WIDTH = 512; 
       final int TILE_HEIGHT = 512; 
       final int TILE_SIZE = TILE_WIDTH * TILE_HEIGHT; 

       int[] pixels = new int[TILE_WIDTH]; 

       short[] rgb_565 = new short[TILE_SIZE]; 

       // Convert 8888 to 565, and swap red and green channel position: 

       int i = 0; 
       for (int y = 0; y < TILE_HEIGHT; y++) { 
        image.getPixels(pixels, 0, TILE_WIDTH, 0, y, TILE_WIDTH, 
     1); 
        for (int x = 0; x < TILE_WIDTH; x++) { 
         int argb = pixels[x]; 
         int r = 0x1f & (argb >> 19); // Take 5 bits from23..19 
         int g = 0x3f & (argb >> 10); // Take 6 bits from15..10 
         int b = 0x1f & (argb >> 3); // Take 5 bits from 7.. 3 
         int rgb = (r << 11) | (g << 5) | b; 
         rgb_565[i] = (short) rgb; 
         ++i; 
        } 
       } 
       ShortBuffer textureBuffer = ShortBuffer.wrap (rgb_565, 0, 
     TILE_SIZE); 
       gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGB, 48, 48, 0, 
         GL10.GL_RGB, GL10.GL_UNSIGNED_SHORT_5_6_5, 
     textureBuffer); 

    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e + 4; 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e + 4; 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e + 4; 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e + 4; 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e + 4; 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e + 4; 
    q++; 
    } 

} 
+0

您可能想要發佈一些示例代碼,不清楚線程是如何啓動的,以及您是否嘗試使用處理程序。 – SirDarius 2010-07-19 15:57:22

+0

我編輯了我的問題來添加代碼。 – Skizit 2010-07-19 15:59:53

回答

2

的錯誤表明您正在調用一些代碼,希望從UI線程調用,但並非如此。 gl onDrawFrame不從UI線程調用,因此是錯誤。

從代碼看來,這看起來發生在Extract類的構造函數中。什麼是班級全名?

假設提取方法從相機或類似物中加載圖像。我將代碼從gl線程中提取出來,你可能不想通過在gl線程上進行這種轉換來限制你的fps :-)它更好地在單獨的線程上「儘可能快」地執行這個操作,並且讓gl畫出最新的。

如果你確實需要在這裏工作,請使用Handler