2010-07-16 2 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().

Весь этот снайпер находится внутри одного класса.

Спасибо за любую помощь.

... 

    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, чтобы это логическое продолжение с лямбда-выражений дает более сжатую код:

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

Отлично! Спасибо Ален. – user225626

+0

Это было мое удовольствие :) –

Смежные вопросы