Почему Glide выбрасывает IllegalArgumentException, когда действие перезапускается? - PullRequest
0 голосов
/ 06 октября 2018

Я использую Glide для загрузки изображения из Интернета в моем приложении для Android.Когда пользователь нажимает кнопку «Выйти», я выхожу из системы, удаляя все общие настройки и перезапуская приложение, используя следующий код:

Intent i = getActivity().getBaseContext().getPackageManager().getLaunchIntentForPackage( getActivity().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);    
getActivity().finish();

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

Вот подробности журнала:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.highavenue.android, PID: 21503
              java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
                  at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
                  at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)
                  at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:87)
                  at com.bumptech.glide.Glide.with(Glide.java:629)
                  at com.highavenue.android.adapter.ActivityTimelineAdapter.onBindViewHolder(ActivityTimelineAdapter.java:181)
                  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
                  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
                  at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
                  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
                  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
                  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)

Код: (где и как я использовал Glide)

Glide.with(context)
                .load(users_list.get(user_position).getProfileImageURL())
                .thumbnail(0.1f)
                .override(100, 100)
                .into(holder.profile_image);

приведенный выше код использовался в классе RecyclerViewAdapter, где context ссылается на контекст фрагмента.

Примечание. Это исключение не возникает, когда пользователь вручную закрывает приложение и снова открывает его.

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Попробуйте это

Glide.with(getApplicationContext()).load(...)
0 голосов
/ 09 октября 2018

Ошибка говорит вам о проблеме:

java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

Итак, ваш вызов загрузки Glide выполняется после того, как вы вызвали finish() в Activity.

Вам нужно запретить вызов GlideМетод load после того, как вы завершили Activity.

Учитывая ваш текущий код, вы можете установить флаг или что-то, чтобы сказать адаптеру не загружать изображения:

mAdapter.disableImageLoading(); // Set a flag that internally prevents the Glide load from happening
Intent i = getActivity().getBaseContext().getPackageManager().getLaunchIntentForPackage( getActivity().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);    
getActivity().finish();

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

Надеюсь, это поможет!

0 голосов
/ 07 октября 2018

Я думаю, этого будет достаточно (Добавлено Intent.FLAG_ACTIVITY_CLEAR_TASK):

Intent i = getActivity().getBaseContext().getPackageManager().getLaunchIntentForPackage( getActivity().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);  

Однако, как указано в том же вопросе здесь , вы можете попробовать использовать:

Glide.with(YourActivityName.this) // or `getApplicationContext()`

Вместо получения context.Это, вероятно, решит ошибку.

...