Runnable с WindowManager отображает окно только после его завершения - PullRequest
0 голосов
/ 22 февраля 2019

Я использую JobIntentService, который использует mHandler.post(new Runnable()), чтобы показать «плавающее окно».
Я хочу, чтобы окно отображалось в течение x секунд, а затем исчезало, до сих пор я использовал Serviceи не JobIntentService, так что это было легко (не требуется обработчик / runnable), теперь, когда Runnable показывает окно, я заметил, что окно фактически не отображается, пока runnable не завершит свой запуск.

Runnable code

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    @Override public void run() {
        labelsLayer.show();
        Thread.sleep(5000);
        //labelsLayer.hide();
    }
    // window attached only after run() completes
}

Вот код для отображения окна

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            getWindowFlag(),
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);

params.gravity = Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM;

windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(frameLayout, params);

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rootView = layoutInflater.inflate(R.layout.overlay_labels_list_layout, frameLayout);

linearLayout = rootView.findViewById(R.id.overlay_labels_layout);
linearLayout.setVisibility(View.GONE);

Animation in = AnimationUtils.loadAnimation(context, 
android.R.anim.fade_in);
in.setDuration(500);
linearLayout.setVisibility(VISIBLE);
linearLayout.startAnimation(in);
...