2010-07-16 96 views
1

Eclipse redlines width, height, width, height在回調中的doSomething()arg列表中。左邊的紅色小X;說:var值從外部調用回調函數:

Multiple markers at this line 
- Cannot refer to a non-final variable height inside an inner class defined in a different 
    method 
- Cannot refer to a non-final variable width inside an inner class defined in a different 
    method 
- Cannot refer to a non-final variable width inside an inner class defined in a different 
    method 
- Cannot refer to a non-final variable height inside an inner class defined in a different 
    method 

很顯然,我不想重複getWindowManager().getDefaultDisplay()holder回調內部或從doSomething()內多次獲得這些值浪費週期。

這整個snip是在一個類中。

感謝您的任何幫助。

... 

    Display display = getWindowManager().getDefaultDisplay(); 
    int width = display.getWidth(); 
    int height = display.getHeight(); 

    ... 

    final GL10 gl = (GL10) eglContext.getGL(); 
    final Handler handler = new Handler(); 
    SurfaceHolder holder = view.getHolder(); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); 

    int w = 0; 
    int h = 0; 
    int x = 0; 
    int y = 0; 

    int b[] = new int[w * (y + h)]; 
    int bt[] = new int[w * h]; 
    IntBuffer ib = IntBuffer.wrap(b); 
    ib.position(0); 
    gl.glReadPixels(x, 0, w, y + h, GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE,ib); 

    ... 

    holder.addCallback(new Callback() { 
    private EGLSurface surface; 
    private Runnable painter; 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     painter = new Runnable() { 
     @Override 
     public void run() { 
      doSomething(width, height, width, height, gl); 
     } 
     }; 
     handler.post(painter); 
    } 
    }); //Callback ends. 
} 

private void doSomething(int x, int y, int w, int h, GL10 gl) { 
    // do something 
} 

回答

2

最終關鍵字在寬度高度surfaceChanged(...)方法的參數,使他們的運行訪問()方法在畫家Runnable並擺脫編譯器錯誤。

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, final int width, final int height) { 
    painter = new Runnable() { 
    @Override 
    public void run() { 
     doSomething(width, height, width, height, gl); 
    } 
    }; 
    handler.post(painter); 
} 

這是Java 8可以避免的,因爲它會考慮寬度高度有效最終

考慮在Java 8思想是合乎邏輯的延伸與Lambda表達式得到更簡潔的代碼:

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    painter =() -> { 
     doSomething(width, height, width, height, gl); 
    }; 
    handler.post(painter); 
} 
+0

真棒!謝謝阿蘭。 – user225626 2010-07-17 00:10:24

+0

這是我的榮幸:) – 2010-07-17 01:34:30