@Override public void handleMessage(Message msg) { if (msg.what == TASK_FINISHED) { mViewModificationInProgress = false; if (mNextClusters != null) { // Run the task that was queued up. sendEmptyMessage(RUN_TASK); } return; } removeMessages(RUN_TASK); if (mViewModificationInProgress) { // Busy - wait for the callback. return; } if (mNextClusters == null) { // Nothing to do. return; } RenderTask renderTask; synchronized (this) { renderTask = mNextClusters; mNextClusters = null; mViewModificationInProgress = true; } renderTask.setCallback( new Runnable() { @Override public void run() { sendEmptyMessage(TASK_FINISHED); } }); renderTask.setProjection(mMap.getProjection()); renderTask.setMapZoom(mMap.getCameraPosition().zoom); new Thread(renderTask).start(); }