2010-11-23 2 views
1

내 응용 프로그램에서 처리기를 사용하여 무작위로 실행 한 후에 실행 가능 파일을 실행하는 서비스가 있습니다. 이 프로그램은 몇 시간 동안 잘 작동합니다. 나는 응용 프로그램을 다시 시작할 수 있습니다, 응용 프로그램 강제 닫히고 자마자, 또한몇 시간 후 처리기가 NullPointerException을 던지기

java.lang.NullPointerException 
at com.martin.ontime.OnTimeService$2.run(OnTimeService.java:224) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:144) 
at android.app.ActivityThread.main(ActivityThread.java:4937) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

및 예외가 다른 몇 시간 동안 발생되지 않습니다 : 갑자기, 프로그램은 다음 추적에 NullPointerException이 발생합니다 . 핸들러와 관련된 약식 코드는 다음과 같습니다.

public class AppService extends Service{ 

/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

INITIATE ALL THE GLOBAL VARIABLES 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/ 

//Handler that times the processes 
private Handler h = new Handler(); 

/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/ 







/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

    EXECUTE ALL CREATE FUNCTIONS 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/ 

@Override 
public void onCreate(){ 

    super.onCreate(); 

    //Clear all timers 
    h.removeCallbacks(setTime); 
    h.removeCallbacks(setAuto); 

    //Set a timer to start the processes 
    h.postDelayed(setAuto, 0); 

} 

/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/  







/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

    EXECUTE THESE FUNCTIONS WHEN SERVICE IS STOPPED 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/  

@Override 
public void onDestroy(){ 

    //Clear all timers 
    h.removeCallbacks(setTime); 
    h.removeCallbacks(setAuto); 

} 

    /**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/  





/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

    HANDLER RUNNABLE 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/  

//Runnable 
private Runnable setAuto = new Runnable() { 

    public void run(){ 

    //Create a random number generator 
    Random r = new Random(); 

    //Determine a random amount of time until time is changed 
    long d = r.nextInt(5) * 60 * 1000; 

    //Wait 
    h.postDelayed(setTime, d); 

    } 

}; 

//Runnable used to set a random allowance 
private Runnable setTime = new Runnable() { 

    public void run(){ 

    try { 

    //Create a random number generator 
    Random r = new Random(); 

    //Determine a random amount of time until time is changed 
    long d = r.nextInt(30) * 60 * 1000 + 1800000; 

    //Wait 
    h.postDelayed(setAuto, d); 

          ***TRY/CATCH SURROUNDS A DATA OUTPUT STREAM*** 

    } 

    catch (IOException e){ 

    e.printStackTrace(); 

    } 

    } 

}; 

    /**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/  
} 

이 서비스에이 문제가있는 것으로 보이는 프로그램이 있습니다. 나는 핸들러와 실행 파일에 관련된 코드를 복사하고 두 프로그램에서 공유한다. 이 문제를 해결하기에 충분한 정보라고 생각합니다. 더 이상 정보가 필요하다면 필자는 반드시 공백을 채울 것입니다. 이것들과 나의 미래의 애플 리케이션을위한 큰 도움이 될 것입니다!

+1

OnTimeService.java의 224 행은 어디에 있습니까? –

답변

0

나는 특정 조건 하에서 만 실행 파일을 인스턴스화하고 특정 조건 하에서는 실제로 postDelayed를 실행하기 때문에 매우 비슷한 문제가 발생했습니다.

if (conditions){ 
    myRunnable = new Runnable(){ 
    @Override 
    public void run(){ 
    } 
    } 
myHandler.postDelayed(myRunnable, 1000*60*1); 
} 
@Override 
public void onDestroy(){ 
myHandler.removeCallbacks 
} 

를 들어 잘못이라고 콜백을 제거 내 실수에 의한 경우 나 예외가 잡힌, 지금

@Override 
public void onDestroy(){ 
try { 
if (conditions) 
myHandler.removeCallbacks; 
} catch (Exception e){//do nothing 
} 

로 변경, 힘 가까이를 일으킬 수없는이 보장하고 그것에 가깝게 강요하지 않는다.

아마도 특정 조건이 충족되지 않았거나 postDelayed가 시작되기 전에 postDelayed가 실행되지 않는 경우 시스템에서 서비스를 파괴하여 ondestroy의 removecallback을 호출하게 만들었을 수 있습니다. try 블록에 넣으면 trycallback이 실패 할 수 있지만 사용자가 영향을 미치지는 않습니다.

8 개월 전이 질문을 받았지만 다른 대답이 도움이 될 수 있다고 생각합니다. :) 희망이 도움이됩니다.

관련 문제