Java Android:为什么Runnable在引用外部类方法时得到nullpointerexception?
我遇到了一个奇怪的情况,下面是我的示例代码Java Android:为什么Runnable在引用外部类方法时得到nullpointerexception?,java,android,nullpointerexception,Java,Android,Nullpointerexception,我遇到了一个奇怪的情况,下面是我的示例代码 public class MyMonitorService extends Service { private MyMonitorManager mMyMonitorManager = new MyMonitorManager(); private Timer mTimer = new Timer(); @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated
public class MyMonitorService extends Service {
private MyMonitorManager mMyMonitorManager = new MyMonitorManager();
private Timer mTimer = new Timer();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public boolean isHome(){
/**
* Sample code
*/
return true;
}
public void start(){
mTimer.schedule(r, 1000);
}
private TimerTask r = new TimerTask(){
@Override
public void run() {
try {
if(isHome()){
// xxxxx
}
} catch (Exception e) {
}
}
};
}
在一些定制的ROM/手机上,比如MIUI,虽然很少,但当执行if(isHome())
时,我得到了nullpointerexception,应用程序崩溃
甚至我也把时间任务改成了
private TimerTask r = new TimerTask(){
@Override
public void run() {
try {
if(mMyMonitorManager.isRunning()){
// xxxxx
}
} catch (Exception e) {
}
}
};
当if(mMyMonitorManager.isRunning())
时,我仍然得到了nullpointerexception
我认为有时MyMonitorService.this是由dalvik设置的,这是唯一可能的解释,因为我已经用try-catch保护了整个run方法,但有任何例外……是否可能内部类丢失了外部类引用?听起来您的服务正在被破坏,因此外部类不再可用 由于您的服务从onBind返回null,我假设您希望使用清单中的startService或intent筛选器启动服务。但是您有onStartCommand方法吗?这就是您应该执行服务工作的地方,该函数的返回值决定服务是否保持运行 您是否打算在TimerTask运行时保持服务运行,然后停止它?在这种情况下,您可以从onstart命令中启动TimerTask,返回START\u STICKY,然后在TimerTask完成时停止服务。大概是这样的:
public int onStartCommand(Intent intent, int flags, int startId) {
mTimer.schedule(r, 1000);
return START_STICKY;
}
private TimerTask r = new TimerTask(){
@Override
public void run() {
try {
if(isHome()){
// xxxxx
}
} catch (Exception e) {
} finally {
stopSelf();
}
}
};
这可能还不够好,因为我猜可能会有多个任务同时进行。在停止服务之前,您需要知道所有任务都已完成。即使您多次调用startService,对stopService或stopSelf的第一次调用也会停止所有调用的服务。是的,有onStart命令。为了简单起见,我没有粘贴该方法。实际上,它返回START\u STICKY。说到这个问题,当服务被破坏时,我认为这只意味着它的状态比Java引用或其他东西更重要……是吗?看起来外部类引用至少应该足以将服务对象保留在内存中,但可能这些对象正在被特别处理。所以,如果你有一个粘性服务,它是如何停止的?