1

I'm working with android 3.0 drag-n-drop framework. All works fine. But after 30 actions application causes IllegalArgumentException.

09-12 11:17:32.282: WARN/Surface(31132): Not initializing the shared buffer client because token = -12
09-12 11:17:32.282: ERROR/View(31132): Unable to initiate drag
09-12 11:17:32.282: ERROR/View(31132): java.lang.IllegalArgumentException
09-12 11:17:32.282: ERROR/View(31132):     at android.view.Surface.lockCanvasNative(Native Method)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.Surface.lockCanvas(Surface.java:350)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.View.startDrag(View.java:11467)
09-12 11:17:32.282: ERROR/View(31132):     at com.example.drag.drop.Dot$1.onTouch(Dot.java:70)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.View.dispatchTouchEvent(View.java:4605)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
09-12 11:17:32.282: ERROR/View(31132):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1709)
09-12 11:17:32.282: ERROR/View(31132):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1264)
09-12 11:17:32.282: ERROR/View(31132):     at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
09-12 11:17:32.282: ERROR/View(31132):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1682)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.View.dispatchPointerEvent(View.java:4677)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2392)
09-12 11:17:32.282: ERROR/View(31132):     at android.view.ViewRoot.handleMessage(ViewRoot.java:2054)
09-12 11:17:32.282: ERROR/View(31132):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-12 11:17:32.282: ERROR/View(31132):     at android.os.Looper.loop(Looper.java:132)
09-12 11:17:32.282: ERROR/View(31132):     at android.app.ActivityThread.main(ActivityThread.java:4123)
09-12 11:17:32.282: ERROR/View(31132):     at java.lang.reflect.Method.invokeNative(Native Method)
09-12 11:17:32.282: ERROR/View(31132):     at java.lang.reflect.Method.invoke(Method.java:491)
09-12 11:17:32.282: ERROR/View(31132):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
09-12 11:17:32.282: ERROR/View(31132):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-12 11:17:32.282: ERROR/View(31132):     at dalvik.system.NativeStart.main(Native Method)
09-12 11:17:34.272: WARN/WindowManager(4050): Drag already in progress
09-12 11:17:34.622: WARN/WindowManager(4050): Drag already in progress
09-12 11:17:34.912: WARN/WindowManager(4050): Drag already in progress
09-12 11:17:35.462: WARN/WindowManager(4050): Drag already in progress
09-12 11:17:35.782: WARN/WindowManager(4050): Drag already in progress
09-12 11:17:37.282: ERROR/WindowManager(4050): Unregister of nonexistent drag input channel

Application again works fine after dalvinkvm calls for each DragEvent

09-12 11:18:06.662: WARN/Surface(31132): Surface.finalize() has work. You should have called release() (1720472, 0)

As you can see time delay between exception and finalization is approximately 30 sec.

Same exception occurs on two example projects from books:

1)http://www.manning.com/collins/; example on chapter 15: http://www.manning-sandbox.com/thread.jspa?messageID=117809&tstart=0

2)http://www.apress.com/9781430232223; example on chapter 31

Question:

1)How finalize DragEvents properly?

or

2)How call Surface.finalize() if I'm working with GridView for example?

Thanks.

Dmytro Boichenko
  • 5,217
  • 3
  • 28
  • 31
  • I didn't resolve this problem. This problem occurs because GC not perform collecting of drags. But if window redrew, GC perform collecting of drags. Window will be redrawn after soft keyboard opened or some ImageView updated or something like this. – Dmytro Boichenko Sep 14 '11 at 08:44

1 Answers1

1

I've been struggling with this Honeycomb bug for days, and found a way out of it, although I'm not sure your situation is similar to mine.

In my case, now I can say for certain, the "Unable to initiate drag" message was at the end of a chain-reaction starting with updates made to a data-adapter supporting a ListView (whose items I was trying to allow the user drag and drop). The problem was, in fact, with the "Drop", where I would change something in the underlying data and ask the adapter to notify the ListView of DataSetChanged.

What did the magic for me, quite amazingly, was replacing every call to:

lv.getAdapter().notifyDataSetChanged();

with:

resetListView(lv)

defined as:

private void resetListView(ListView lv)
{
    int position = lv.getFirstVisiblePosition();
    int y = lv.getChildAt(0).getTop();
    lv.setAdapter(lv.getAdapter());
    lv.setSelectionFromTop(position, y);
}

Similar to notifyDataSetChanged(), this method makes sure that the ListView gets updated with the latest adapter-data, but in addition, it also resets some internal structures inside the ListView, preventing the later drag-and-drop chain-reaction leading to the above mentioned exception.

Life with Honeycomb is NOT easy.

Zach-M
  • 2,127
  • 18
  • 12