我正在开发一个应用程序,其中包含从服务器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被清除并首次启动时,为什么应用程序正常工作?背景中有什么东西干扰吗?我真的不知道。我希望你能说出来!
任何帮助非常赞赏!