2013-06-26 3 views
0

Я читал много сообщений здесь и на других сайтах, но не могу найти проблему с созданием моей ошибки:
Я использую AsyncTask, потому что я хочу легко манипулировать потоком пользовательского интерфейса до и после выполнения.
В doInBackground Я создаю ThreadPoolExecutor и запускаю Runnables.
Если я выполнить только 1 Runnable с Исполнителем, не проблема, но если я выполняю другой Runnable я получаю следующую ошибку:Android Signal 11 (SIGSEGV)

06-26 18:00:42.288: A/libc(25073): Fatal signal 11 (SIGSEGV) at 0x7f486162 (code=1), thread 25106 (pool-1-thread-2) 
06-26 18:00:42.304: D/dalvikvm(25073): GC_CONCURRENT freed 119K, 2% free 8908K/9056K, paused 4ms+4ms, total 45ms 
06-26 18:00:42.327: I/System.out(25073): In Check All with Prefix: a and Length: 4 
06-26 18:00:42.390: I/DEBUG(126): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
06-26 18:00:42.390: I/DEBUG(126): Build fingerprint: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys' 
06-26 18:00:42.390: I/DEBUG(126): Revision: '9' 
06-26 18:00:42.390: I/DEBUG(126): pid: 25073, tid: 25106, name: pool-1-thread-2 >>>  de.uni_duesseldorf.cn.distributed_computing2 <<< 
06-26 18:00:42.390: I/DEBUG(126): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 7f486162 

... 

06-26 18:00:42.538: I/DEBUG(126): memory map around fault addr 7f486162: 
06-26 18:00:42.538: I/DEBUG(126):  60292000-60391000 
06-26 18:00:42.538: I/DEBUG(126):  (no map for address) 
06-26 18:00:42.538: I/DEBUG(126):  bed14000-bed35000 [stack] 

Я создал ThreadPoolExecutor так:

// numberOfPackages: Number of Runnables to be executed 
public void initializeThreadPoolExecutor (int numberOfPackages) 
{ 
    int corePoolSize = Runtime.getRuntime().availableProcessors(); 
    int maxPoolSize = numberOfPackages; 
    long keepAliveTime = 60; 
    final BlockingQueue workingQueue = new LinkedBlockingQueue(); 
    executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workingQueue); 
} 

Я понятия не имею, почему он терпит неудачу при запуске второй темы.
Возможно утечки памяти?

Любая помощь оценена.
Заранее спасибо

+0

Выполняете ли вы собственный код с помощью NDK? – CommonsWare

+0

Нет. Я не использую собственный код через NDK. Я просто пытаюсь перечислить все перестановки из определенных символов заданной длины. – Naturjoghurt

ответ

0

Я нашел причину этой проблемы.

Я создавал рабочую очередь как локальную переменную в initializeThreadPoolExecutor(). После выхода из метода кажется, что рабочая очередь была удалена Java Garbage Collector, поэтому она была недоступна, когда я хотел добавить еще одну Task в очередь.

Чтобы устранить проблему, я создал глобальную переменную workingQueue и использовал ее при инициализации моего ThreadPoolExecutor.

Спасибо за помощь.

+2

Как вы отследили проблему? Я пытаюсь выяснить, что вызывает собственный SIGSEGV. Благодаря! – garlicman

1

Если вы не выполняете какой-либо родной собственный код (или с третьей стороной библиотеки, которую вы добавили), то вы спотыкаясь некоторыми ошибками в вашей копии Android на этом устройстве. Хотя ошибки в собственном коде могут приводить к SIGSEGV, вы ничего не делаете с Java.

Если вы можете воспроизвести это на нескольких устройствах/эмуляторах от нескольких производителей, проблема может быть в самом Android. Если проблема возникает только на одном устройстве, то это, скорее всего, будет ошибкой, уникальной для этого устройства.

0

Пусть RejectionExecutionHandler ручка это,
Просто добавьте еще один параметр (new ThreadPoolExecutor.DiscardPolicy()) к конкретизации ThreadPoolExecutor ниже

executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workingQueue,new ThreadPoolExecutor.DiscardPolicy()); 
+0

Спасибо. Но это тоже не помогло. – Naturjoghurt

1

У меня была такая же ошибка, но я понял, что авария произошла из-за того, что я хранил растровые изображения в своих объектах, и Android не справляется с битмапами. Я изменил тип данных с Bitmap на String, преобразовывая битмапы в строку Base64, которая разрешила фатальную проблему. Это может помочь кому-то.