summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2/LauncherModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher2/LauncherModel.java')
-rw-r--r--src/com/android/launcher2/LauncherModel.java44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 792759399..269a0fd60 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -82,6 +82,12 @@ public class LauncherModel extends BroadcastReceiver {
private LoaderTask mLoaderTask;
private boolean mIsLoaderTaskRunning;
+ // Specific runnable types that are run on the main thread deferred handler, this allows us to
+ // clear all queued binding runnables when the Launcher activity is destroyed.
+ private static final int MAIN_THREAD_NORMAL_RUNNABLE = 0;
+ private static final int MAIN_THREAD_BINDING_RUNNABLE = 1;
+
+
private static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader");
static {
sWorkerThread.start();
@@ -177,6 +183,9 @@ public class LauncherModel extends BroadcastReceiver {
/** Runs the specified runnable immediately if called from the main thread, otherwise it is
* posted on the main thread handler. */
private void runOnMainThread(Runnable r) {
+ runOnMainThread(r, 0);
+ }
+ private void runOnMainThread(Runnable r, int type) {
if (sWorkerThread.getThreadId() == Process.myTid()) {
// If we are on the worker thread, post onto the main handler
mHandler.post(r);
@@ -200,17 +209,22 @@ public class LauncherModel extends BroadcastReceiver {
return Bitmap.createBitmap(mDefaultIcon);
}
- public void unbindWorkspaceItems() {
- sWorker.post(new Runnable() {
- @Override
- public void run() {
- unbindWorkspaceItemsOnMainThread();
- }
- });
+ public void unbindItemInfosAndClearQueuedBindRunnables() {
+ if (sWorkerThread.getThreadId() == Process.myTid()) {
+ throw new RuntimeException("Expected unbindLauncherItemInfos() to be called from the " +
+ "main thread");
+ }
+
+ // Clear any deferred bind runnables
+ mDeferredBindRunnables.clear();
+ // Remove any queued bind runnables
+ mHandler.cancelAllRunnablesOfType(MAIN_THREAD_BINDING_RUNNABLE);
+ // Unbind all the workspace items
+ unbindWorkspaceItemsOnMainThread();
}
/** Unbinds all the sBgWorkspaceItems and sBgAppWidgets on the main thread */
- private void unbindWorkspaceItemsOnMainThread() {
+ void unbindWorkspaceItemsOnMainThread() {
// Ensure that we don't use the same workspace items data structure on the main thread
// by making a copy of workspace items first.
final ArrayList<ItemInfo> tmpWorkspaceItems = new ArrayList<ItemInfo>();
@@ -880,7 +894,7 @@ public class LauncherModel extends BroadcastReceiver {
// Post the remaining side pages to be loaded
if (!mDeferredBindRunnables.isEmpty()) {
for (final Runnable r : mDeferredBindRunnables) {
- mHandler.post(r);
+ mHandler.post(r, MAIN_THREAD_BINDING_RUNNABLE);
}
mDeferredBindRunnables.clear();
}
@@ -1602,7 +1616,7 @@ public class LauncherModel extends BroadcastReceiver {
if (postOnMainThread) {
deferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}
@@ -1619,7 +1633,7 @@ public class LauncherModel extends BroadcastReceiver {
if (postOnMainThread) {
deferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}
@@ -1638,7 +1652,7 @@ public class LauncherModel extends BroadcastReceiver {
if (postOnMainThread) {
deferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}
}
@@ -1706,7 +1720,7 @@ public class LauncherModel extends BroadcastReceiver {
}
}
};
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
// Load items on the current page
bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets,
@@ -1720,7 +1734,7 @@ public class LauncherModel extends BroadcastReceiver {
}
}
};
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
// Load all the remaining pages (if we are loading synchronously, we want to defer this
@@ -1749,7 +1763,7 @@ public class LauncherModel extends BroadcastReceiver {
if (isLoadingSynchronously) {
mDeferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}