Android Signal 11(SIGSEGV)

时间:2013-06-26 16:13:02

标签: android android-asynctask runnable threadpoolexecutor

我在这里和其他网站上阅读了很多帖子,但找不到创建错误的问题:
我使用AsyncTask是因为我想在执行之前和之后轻松操作UI线程 在doInBackground中,我创建了一个ThreadPoolExecutor并执行Runnables 如果我只使用Executor执行1 Runnable,则没有问题,但如果我执行另一个Runnable,我会得到以下错误:

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);
}

我不知道为什么在启动第二个Thread时失败 也许内存泄漏?

任何帮助表示赞赏。
在此先感谢

4 个答案:

答案 0 :(得分:1)

如果您没有执行自己的任何本机代码(或者您添加的第三方库),那么您将在此设备上绊倒Android副本中的某些错误。虽然本机代码中的错误可能导致SIGSEGV,但您从Java那里做的任何事情都不应该。

如果您可以在多个制造商的多个设备/模拟器中重现这一点,那么问题可能出在Android本身。如果问题仅显示在单个设备上,则可能是该设备特有的错误。

答案 1 :(得分:1)

我遇到了同样的错误,但我发现发生了崩溃,因为我在我的对象中存储了Bitmaps而且Android无法很好地处理Bitmaps。我通过将Bitmaps转换为Base64字符串将数据类型从Bitmap更改为String,从而解决了致命问题。这可能对某人有所帮助。

答案 2 :(得分:0)

RejectionExecutionHandler处理它,
只需将另一个参数(new ThreadPoolExecutor.DiscardPolicy())添加到ThreadPoolExecutor的实例化中,如下所示

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

答案 3 :(得分:0)

我找到了这个问题的原因。

我在initializeThreadPoolExecutor()中创建了一个工作队列作为局部变量。 退出该方法后,Java垃圾收集器似乎删除了工作队列,因此当我想在队列中添加另一个Task时,它无法访问。

要解决此问题,我创建了一个全局变量workingQueue,并在初始化ThreadPoolExecutor时使用了此项。

感谢您的帮助。