2015-10-14 3 views
4

Мы используем AsyncTaskLoaders в нашем приложении для загрузки содержимого. Мы получаем этот крахModernAsyncTask IllegalStateException

java.lang.IllegalStateException: Cannot execute task: the task is already running. 
    at android.support.v4.content.ModernAsyncTask.doInBackground(ModernAsyncTask.java:414) 
    at android.support.v4.content.AsyncTaskLoader.executePendingTask(AsyncTaskLoader.java:219) 
    at android.support.v4.content.AsyncTaskLoader.dispatchOnCancelled(AsyncTaskLoader.java:232) 
    at android.support.v4.content.AsyncTaskLoader$LoadTask.onCancelled(AsyncTaskLoader.java:88) 
    at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:464) 
    at android.support.v4.content.ModernAsyncTask.access$400(ModernAsyncTask.java:48) 
    at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:483) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:211) 
    at android.app.ActivityThread.main(ActivityThread.java:5335) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 

Мы попытались воспроизвести это, но не были успешными!

Есть ли способ узнать, какой погрузчик вызывает это?

Мы используем com.android.support:support-v4:23.0.1

Мы рассматриваем возможность того, что это может иметь связь с деятельностью утечек, кроме того, это вся информация мы получаем.

Любые идеи?

+0

Вы использовали событие yourtask.cancel? –

+0

Мы не вызываем отмену явно –

ответ

0

Уместно, что у вас есть в вашей деятельности, или ссылка класса-оболочки для async-задачи. Если вы выполняете эту задачу в onClick. Вы можете нажать два раза на View, и вы получите эту ошибку.

Update

Если вы хотите, чтобы проверить активность протекла, вы можете использовать Leak канарейку. Это очень полезный инструмент.

Leak canary

Вы можете использовать StrictMode для поиска информации о утечках.

public void onCreate() { 
if (DEVELOPER_MODE) { 
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
      .detectDiskReads() 
      .detectDiskWrites() 
      .detectNetwork() // or .detectAll() for all detectable problems 
      .penaltyLog() 
      .build()); 
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
      .detectLeakedSqlLiteObjects() 
      .detectLeakedClosableObjects() 
      .penaltyLog() 
      .penaltyDeath() 
      .build()); 
} 
super.onCreate(); 

}

+0

Нет, вы ошибаетесь. в этом случае вы получите: http://pastebin.com/mLs8Qu3e AsyncTask не имеет ничего общего с ModernAsyncTask, который использует загрузчик. –

2

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

Оказалось, что при создании наблюдателя на моем загрузчике я передал обработчик как нуль, ожидая аналогичного поведения, которое я получил бы, если бы использовал стандартный конструктор для Handler (для его запуска в основном потоке, создавая его). Однако происходит то, что он вызывает onChange сразу, из любой нити .. onChange, по крайней мере, в моем случае вызывает onerontChanged загрузчика, который должен быть вызван из главного потока ... поскольку это не так, задача и cancelationTask завинчиваются (из-за отсутствия лучшего технического термина), что приводит к срабатыванию отмены в непредвиденном состоянии задачи, следовательно, сообщение об ошибке.

Это также проявилось в моем случае, когда загрузчик не правильно обновлял записи, для параметра cancelationTask уже было загружено значение, поэтому загрузчик отбрасывал новые задачи, поэтому новый груз был пропущен (takeContentChanged был ложным).

Итак, убедитесь, что вы инициализируете своего наблюдателя, используя новый обработчик() из основного потока (onStartLoading должно быть прекрасным местом для этого).

+0

Вы уже выпустили? Не могли бы вы понять это? – Macarse

+0

Я выпустил, и это помогло, за исключением, по крайней мере, я не видел его с тех пор :) – sickmartian

Смежные вопросы