Android 3.0 drag-n-drop IllegalArgumentException после 30 действий - PullRequest
1 голос
/ 12 сентября 2011

Я работаю с фреймворком Android 3.0 drag-n-drop. Все работает отлично. Но после 30 действий приложение вызывает 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

Приложение снова работает нормально после вызовов dalvinkvm для каждого DragEvent

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

Как видите, задержка между исключением и завершением составляет приблизительно 30 секунд.

То же исключение происходит в двух примерах проектов из книг:

1) http://www.manning.com/collins/; пример в главе 15: http://www.manning -sandbox.com / thread.jspa? MessageID = 117809 & tstart = 0

2) http://www.apress.com/9781430232223; пример по главе 31

Вопрос:

1) Как правильно завершить DragEvents?

или

2) Как вызвать Surface.finalize (), если я работаю с GridView, например?

Спасибо.

1 Ответ

1 голос
/ 18 ноября 2011

Я боролся с этой ошибкой Сота в течение нескольких дней и нашел выход из нее, хотя я не уверен, что ваша ситуация похожа на мою.

В моем случае, теперь я могу с уверенностью сказать, что сообщение «Невозможно инициировать перетаскивание» было в конце цепной реакции, начиная с обновлений, сделанных для адаптера данных, поддерживающего ListView (элементы которого я пытался разрешить пользователю перетащить). На самом деле проблема была в «отбрасывании», когда я что-то изменил в базовых данных и попросил адаптер уведомить ListView о DataSetChanged.

Что удивительно, что волшебство для меня заменяло каждый звонок:

lv.getAdapter().notifyDataSetChanged();

с:

resetListView(lv)

определяется как:

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

Подобно notifyDataSetChanged (), этот метод гарантирует, что ListView обновляется с использованием последних данных адаптера, но, кроме того, он также сбрасывает некоторые внутренние структуры внутри ListView, предотвращая последующую цепную реакцию перетаскивания. приводя к вышеупомянутому исключению.

Жизнь с сотами НЕ легка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...