Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:为什么Runnable在引用外部类方法时得到nullpointerexception?_Java_Android_Nullpointerexception - Fatal编程技术网

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引用或其他东西更重要……是吗?看起来外部类引用至少应该足以将服务对象保留在内存中,但可能这些对象正在被特别处理。所以,如果你有一个粘性服务,它是如何停止的?