Android Concurrency,App在大约3次使用后死亡

时间:2014-01-13 01:20:00

标签: java android networking concurrency executorservice

我正在开发一个应用程序,其中包含从服务器API获取的数据填充的不同视图。截至目前,我已经提出了一个“解决方案”,以便如何充分利用当前可用的多核Android设备。我认为制片人/消费者策略是解决这个问题的正确选择。然而,我使用尽可能多的消费者,因为手机有核心,在执行应用程序时一切正常。但是在某些情况下,当我启动应用程序时,应用程序会死机并且不会执行任何操作,如果我清除设备上的RAM,我可以再次启动应用程序。

消费者运行方法:

while(true) {
            lock.lock();
    while(queuedOperations.isEmpty()) {
        ma.debug("Slave " + slaveId + " is waiting for requests.");
        try {
            slaveCondition.await();
            if(doTerminate) { return; }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    ma.debug("Executing Request... " + slaveId);
    JSONRequestParam[] params = queuedOperations.poll();
    ma.debug("Polled an item. " + slaveId);
    lock.unlock();
    ma.debug(request.execute(params)); // returns a String.
}

使用以下关机方法:

public void destroy() {
        ma.debug("Terminating all external resources...");
        lock.lock();
        this.doTerminate = true;
        slaveCondition.signalAll();
        lock.unlock();
        try {
            service.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        service.shutdown();
}

我触发消费者的方式是来自Condition类的信号。这是代码:

public void submitRequest(JSONRequestParam... params) {
    lock.lock();
    queuedOperations.add(params);
    slaveCondition.signal();
    lock.unlock();
}

我也在主要活动中覆盖了onBackPressed方法;

@Override
public void onBackPressed() {
    try {
        JSONRequestManager.getInstance(this).destroy();
    } catch (Throwable e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    super.onBackPressed();
}

但无济于事。该应用程序是非常错误和不稳定的。我试图在这里和许多不同的网站上找到这个问题的复制品,找不到任何有用的东西。我几乎可以肯定这个应用程序没有死锁,我在使用并发应用程序方面有相当多的经验,但Android在线程方面有点不同......

我是否遗漏了任何提示或做法?当RAM被清除并首次启动时,为什么应用程序正常工作?背景中有什么东西干扰吗?我真的不知道。我希望你能说出来!

任何帮助非常赞赏!

0 个答案:

没有答案