@Override
    public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
      ArrayDeque<TiledTexture> deque = mTextures;
      synchronized (this) {
        long now = SystemClock.uptimeMillis();
        long dueTime = now + UPLOAD_TILE_LIMIT;
        while (now < dueTime && !deque.isEmpty()) {
          TiledTexture t = deque.peekFirst();
          if (t.uploadNextTile(canvas)) {
            deque.removeFirst();
            mGlRoot.requestRender();
          }
          now = SystemClock.uptimeMillis();
        }
        mIsQueued = !mTextures.isEmpty();

        // return true to keep this listener in the queue
        return mIsQueued;
      }
    }