Почему event.getLocalState () редко генерирует исключение ClassCastException? - PullRequest
0 голосов
/ 07 июня 2019

Я внедряю dragListener во фрагмент, как показано в коде ниже:

private class ChoiceDragListener implements View.OnDragListener {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        View view = (View) event.getLocalState();
        TextView dropTarget = (TextView) v;
        if (view == null) {
            return false;
        }
        final TextView dropped = (TextView) view;
        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                dropped.post(new Runnable() {
                    @Override
                    public void run() {
                        dropped.setAlpha(0);
                    }
                });
                //
                break;
// MORE CODE FOLLOWS

Реализация работает на моих тестовых устройствах и для подавляющего большинства пользователей.Согласно Google Console, крошечная часть пользователей имела исключение NullPointException в строке dropped.post(new Runnable(){, которое исчезло после того, как я добавил if (view == null) {return false;} - причина этого до сих пор остается загадкой.

Дело в том, чтотакое же количество пользователей (буквально меньше 10 из 20 000+) теперь получают ClassCastException на View view = (View) event.getLocalState();

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

Тем не менее, я хотел бы знать:

  • Есть ли в моем коде что-нибудь, что могло бы объяснить, почему (даже в редких случаях) может быть выдано ClassCastException?
  • Могу ли я добавить что-нибудь, чтобы помочь этим немногим пользователям?Я немного неохотно использую try / catch, не понимая, что происходит.

Я проверил другие ответы, например Android: classCastException при отображении в держателе Android7.0 и 7.1 getApplication () ClassCastException но они, похоже, не связаны между собой.

Logcat:

Samsung Galaxy S9 (starqltesq), Android 9

java.lang.ClassCastException: 
  at com.****.***.***.fragmentOne$ChoiceDragListener.onDrag (fragmentOne.java:1101)
  at android.view.View.callDragEventHandler (View.java:26053)
  at android.view.View.dispatchDragEvent (View.java:26044)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewGroup.notifyChildOfDragStart (ViewGroup.java:1827)
  at android.view.ViewGroup.dispatchDragEvent (ViewGroup.java:1674)
  at android.view.ViewRootImpl.handleDragEvent (ViewRootImpl.java:7423)
  at android.view.ViewRootImpl.access$2100 (ViewRootImpl.java:198)
  at android.view.ViewRootImpl$ViewRootHandler.handleMessage (ViewRootImpl.java:4984)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:6981)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1445)

Если вам нужны дополнительные сведения или код, я был бы радпредоставить больше контекста.

...