перетаскивание в android 3.x вызывает незаконное исключениеStateException после небольшого количества перетаскиваний

проблема с механизмом перетаскивания в android 3.x: после нескольких перетаскиваний (скажем, 30) возникает исключение (см. прикрепленную ссылку)

https://groups.google.com/forum/#!msg/android-platform/2APvO248NNY/rKI-5dCT8XcJ (Я получаю в журнале то же самое, что и прикрепленное к этому сообщению ..)

технический специалист по Android отвечает там, что это ошибка в API, и говорит, что единственный способ избежать проблемы - вызвать сборщик мусора.

Я сделал это. исключение больше не генерируется, но через некоторое время (скажем, более 30-40 перетаскиваний) android по какой-то причине перестает вызывать событие drop.

Я попытался «обновить» весь вид, освободив все ресурсы / холст / кеш рисунка / переработав растровые изображения, и воссоздать их, и это не помогло (больше не генерировало исключение - но все же после некоторого перетаскивания событие не работает)

единственное, что «помогает» - это закрыть действие и перезапустить его снова.

кто-нибудь как-то решил эту проблему, или есть хорошая простая альтернатива ??? (помимо реализации моей собственной функции перетаскивания ...)

Я хотел бы получить решение, которое не заставит меня перезапускать или воссоздавать что-либо, что не предполагает ...

вот пример кода , который демонстрирует ошибку (не демонстрирует ту часть, которую я сказал о проблеме с событием перетаскивания после использования System.GC):

public class DragandDropExampleActivity extends Activity {

private boolean mIsBeenDragged = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final ImageView imageViewToDRag = (ImageView) findViewById(R.id.image_view_to_drag);

    imageViewToDRag.setClickable(true);

    imageViewToDRag.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mIsBeenDragged = true;
                DragShadowBuilder shadowBuilder = new DragShadowBuilder(imageViewToDRag);
                imageViewToDRag.startDrag(null, shadowBuilder, imageViewToDRag, 0);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {

                mIsBeenDragged = false; 
            }
            return false;
        }
    });

}
}

это xml:







это трассировка стека:

06-04 13:34:32.730: E/View(8061):
java.lang.IllegalArgumentException
    at android.view.Surface.lockCanvasNative(Native Method)
    at android.view.Surface.lockCanvas(Surface.java:350)
    at android.view.View.startDrag(View.java:11489)
    at com.show.dragandrop.DragandDropExampleActivity$1.onTouch(DragandDropExampleActivity.java:32)
    at android.view.View.dispatchTouchEvent(View.java:4617)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java: 1862)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1286)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1835)
    at android.view.View.dispatchPointerEvent(View.java:4689)
    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2415)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:2077)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:132)
    at android.app.ActivityThread.main(ActivityThread.java:4126)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
    at dalvik.system.NativeStart.main(Native Method)

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

TIA

14
задан Tal Kanel 5 June 2012 в 05:05
поделиться