The spooler communicates with he remote PDF renderer asynchronously.
When print is confirmed we close the renderer, destroy it, and unbind
from its service. If we unbind from the service after the print activiy
is finished we get a crash. The bug was that we did not wait until we
disconnect from the remote renderer before finishing the print activity.
bug:
17583115
Change-Id: I55b0135f9c5658b3a4fda2901b8b3bdef044e211
mRenderer.close(callback);
}
- public void destroy() {
+ public void destroy(Runnable callback) {
throwIfNotClosed();
mState = STATE_DESTROYED;
if (DEBUG) {
Log.i(LOG_TAG, "STATE_DESTROYED");
}
- doDestroy();
+ doDestroy(callback);
}
public void startPreload(int firstShownPage, int lastShownPage) {
try {
if (mState != STATE_DESTROYED) {
mCloseGuard.warnIfOpen();
- doDestroy();
+ doDestroy(null);
}
} finally {
super.finalize();
}
}
- private void doDestroy() {
+ private void doDestroy(Runnable callback) {
mState = STATE_DESTROYED;
if (DEBUG) {
Log.i(LOG_TAG, "STATE_DESTROYED");
}
- mRenderer.destroy();
+ mRenderer.destroy(callback);
}
private void throwIfNotOpened() {
}.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
- public void destroy() {
+ public void destroy(final Runnable callback) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
}
mPageContentCache.invalidate();
mPageContentCache.clear();
+ if (callback != null) {
+ callback.run();
+ }
+
}
}.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
return selectedPages;
}
- public void destroy() {
+ public void destroy(Runnable callback) {
throwIfNotClosed();
- doDestroy();
+ doDestroy(callback);
}
@Override
try {
if (mState != STATE_DESTROYED) {
mCloseGuard.warnIfOpen();
- doDestroy();
+ doDestroy(null);
}
} finally {
super.finalize();
mPageContentRepository.stopPreload();
}
- private void doDestroy() {
- mPageContentRepository.destroy();
+ private void doDestroy(Runnable callback) {
+ mPageContentRepository.destroy(callback);
mCloseGuard.close();
mState = STATE_DESTROYED;
if (DEBUG) {
if (mState != STATE_INITIALIZING) {
mProgressMessageController.cancel();
mPrinterRegistry.setTrackedPrinter(null);
- mPrintPreviewController.destroy();
mSpoolerProvider.destroy();
mPrintedDocument.finish();
mPrintedDocument.destroy();
+ mPrintPreviewController.destroy(new Runnable() {
+ @Override
+ public void run() {
+ finish();
+ }
+ });
+ } else {
+ finish();
}
- finish();
}
private final class SpinnerItem<T> {
});
}
- public void destroy() {
+ public void destroy(Runnable callback) {
if (mPageAdapter.isOpened()) {
- mPageAdapter.close(null);
+ Message operation = mHandler.obtainMessage(MyHandler.MSG_CLOSE);
+ mHandler.enqueueOperation(operation);
}
- mRecyclerView.setAdapter(null);
- mPageAdapter.destroy();
+
+ Message operation = mHandler.obtainMessage(MyHandler.MSG_DESTROY);
+ operation.obj = callback;
+ mHandler.enqueueOperation(operation);
}
@Override
} break;
case MSG_DESTROY: {
- mPageAdapter.destroy();
+ Runnable callback = (Runnable) message.obj;
+ mRecyclerView.setAdapter(null);
+ mPageAdapter.destroy(callback);
handleNextOperation();
} break;