RxJava Android вызвал ConcurrentModificationException - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в RxJava в разработке Android.Я изменил в проекте AsyncTask на RxJava и получил исключение ConcurrentModificationException.Да, я использовал коллекцию (sparseArray), но это не имеет значения, потому что исключение было брошено в findViewById.setVisibility.Только когда я пытаюсь вызвать setVisibility.Я запутался, что я делаю не так?У меня есть TextView во фрагменте.Сначала я настраиваю OnClickListener, в слушателе я запускаю Single.fromCallable, затем я настраиваю OnDragListener

TextView tv;

tv.setOnClickListener(v -> {
          if (isClickEnable) {
              tv.setBackgroundResource(R.drawable.cheap_dark);
              cheapInObservable(tv);

          }

});

tv.setOnDragListener(new MyDragListener());

private void cheapInObservable(TextView tView) {
        Single.fromCallable( () ->  tView).subscribeOn(Schedulers.io())
              .delay(250, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
              .doOnSuccess(this::onSuccessCheapIn)
              .subscribe();
    }

И в этом коде я получаю исключение:

private class MyDragListener implements View.OnDragListener {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            View dragView = (View)event.getLocalState();
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_ENDED:
                    if(!event.getResult()) {
                        if(dragView == v) {
                            dragView.setVisibility(View.VISIBLE);
                            activity.findViewById(sparseCheaps.get(dragView.getId())).
                                     setVisibility(View.VISIBLE);

                        }
                    }
                    break;


private void onSuccessCheapIn(TextView tv) {
            tv.setVisibility(View.INVISIBLE);
            TextView tvd = activity.findViewById(sparseCheaps.get(tv.getId()));
            tvd.setVisibility(View.VISIBLE);
            AnimatorSet set = new AnimatorSet();
            tvd.animate().rotation(0);
            int up = activity.findViewById(R.id.guidelineGlowUp).getTop();
            int left = getXcoord(tvd);
            set.setDuration(400).playTogether(ObjectAnimator.ofFloat(tvd, TextView.TRANSLATION_X,
                    tvd.getX(), left),
                    ObjectAnimator.ofFloat(tvd, TextView.TRANSLATION_Y, tvd.getY(), up - 3));

            set.setInterpolator(new AccelerateInterpolator((float) 0.4));

            set.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    isAnimationCheaps = false;
                    super.onAnimationEnd(animation);
                }
            });

            set.start();
        }

Я нашелчто только исключение выбрасывается, когда я использую setVisibility.Если я использую AsyncTask вместо Rx, он будет работать без исключения

StackTrace:

java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:795)
        at java.util.HashMap$KeyIterator.next(HashMap.java:822)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1154)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1156)
        at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:4322)
        at android.view.ViewRootImpl.access$1100(ViewRootImpl.java:103)
        at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3407)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5370)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
...