2016-10-16 15 views
0

У меня есть проект libgdx в студии Android. В классе AndroidLauncher я запускаю ApplicationAdapter под названием ClockActivity, а также регистрирую гостевой диск.Libgdx: приложение вылетает с вызовом CalledFromWrongThreadException, когда GestureDetector пытается изменить яркость экрана

public class AndroidLauncher extends AndroidApplication { 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
     ClockActivity clockActivity = new ClockActivity(); 
     Gdx.input.setInputProcessor(new GestureDetector(new GestureHandler())); 

    } 


class GestureHandler implements GestureDetector.GestureListener { 

      @Override 
     public boolean pan(float x, float y, float deltaX, float deltaY) { 

      WindowManager.LayoutParams layout; 

      Gdx.app.log("LOG:", "pan" + deltaY); 

      layout = getWindow().getAttributes(); 
      float currentValue = layout.screenBrightness; 
      layout.screenBrightness = currentValue - 10; 
      getWindow().setAttributes(layout); 
      return false; 
     } 


} 
} 

ClockActivity расширяет класс ApplicationAdapter, и его задача заключается в отображении текущего системного времени на экране.

public class ClockActivity extends ApplicationAdapter { 
@Override 
public void create() { 
    Gdx.graphics.setContinuousRendering(true); 
} 
@Override 
public void render() { 
    // my job is to display time 
} 
} 

Когда я запускаю на своем телефоне Android, и я пытаюсь скорректировать надежду настроить яркость. Тем не менее, приложение выходит из строя со следующим исключением.

E/AndroidRuntime: FATAL EXCEPTION: GLThread 42617 
       Process: com.mygdx.clock, PID: 25614 
       android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6293) 
        at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:900) 
        at android.view.View.requestLayout(View.java:17378) 
        at android.view.View.setLayoutParams(View.java:11373) 
        at android.view.WindowManagerGlobal.updateViewLayout(WindowManagerGlobal.java:302) 
        at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:74) 
        at android.app.Activity.onWindowAttributesChanged(Activity.java:2608) 
        at android.view.Window.dispatchWindowAttributesChanged(Window.java:832) 
        at com.android.internal.policy.impl.PhoneWindow.dispatchWindowAttributesChanged(PhoneWindow.java:3879) 
        at android.view.Window.setAttributes(Window.java:863) 
        at com.mygdx.clock.AndroidLauncher$GestureHandler.pan(AndroidLauncher.java:99) 
        at com.badlogic.gdx.input.GestureDetector.touchDragged(GestureDetector.java:159) 
        at com.badlogic.gdx.input.GestureDetector.touchDragged(GestureDetector.java:126) 
        at com.badlogic.gdx.backends.android.AndroidInput.processEvents(AndroidInput.java:382) 
        at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:457) 
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1522) 
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239) 

Я не могу понять ошибку CalledFromWrongThreadException. Пожалуйста помоги.

ответ

0

См. Ответ here. Внутри вашего метода pan вы ничего не можете сделать с вашим макетом, поскольку (я думаю) он вызывается из потока GDX, а не из потока Android. Вам нужно будет использовать обработчик для выполнения кода макета в потоке Android.

Может быть, попробовать что-то вроде этого:

private final Handler handler = new Handler(Looper.getMainLooper()); 
private final Runnable panUI = new Runnable() { 
    @Override 
    public void run() { 
     layout = getWindow().getAttributes(); 
     float currentValue = layout.screenBrightness; 
     layout.screenBrightness = currentValue - 10; 
     getWindow().setAttributes(layout); 
    } 
}; 

Теперь в вашем методе пан:

public boolean pan(float x, ...) { 
    handler.post(panUI); 
    return false; 
} 
+0

Спасибо, что работали ... – antman