2017-02-11 4 views
0

응용 프로그램을 살해 한 후 서비스 객체와 변수를 유지하는 방법을 내 서비스 클래스입니다내가</p> <p>다음 <code>START_STICKY</code> 모드에서 서비스를 만든

public class KeepAliveStatusMessageService extends Service { 
private Timer keepAliveStatusMessageTimer; 
private TimerTask timerJob; 
private JsHandler javaSHandler; 

protected void doInBackground() { 
    javaSHandler =LoginActivity.javaSHandler; //JSHandlerSingleton.getInstance().getJavaSHandlerLogin(); 
    keepAliveStatusMessageTimer = new Timer(); 
    AllTimer.getInstance().setKeepAliveStatusMessageTimer(keepAliveStatusMessageTimer); 
    timerJob = new TimerTask() { 
     @Override 
     public void run() { 
      UserInformationProvider userInformationProvider = UserInformationProvider.getInstance(); 
      javaSHandler =GladiusLoginActivity.javaSHandler; 
      Log.v("Service","called"); 
      javaSHandler.keepAliveStatusMessage(userInformationProvider.getIpAddress(), userInformationProvider.getUsername(), userInformationProvider.getSessionId()); 
     } 

     ; 
    }; 
    keepAliveStatusMessageTimer.schedule(timerJob, 5 * 1000, 5 * 1000); 
} 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("LocalService", "Received start id " + startId + ": " + intent); 
    doInBackground(); 
    return START_STICKY; 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

이 서비스 작업을 완벽하게 내 응용 프로그램을 사용할 때 또는 간다 배경, 에서하지만 배경에서 스 와이프하여 내 애플 리케이션을 죽일 때 나는 오류를

치명적인 예외 다음 점점 오전 : 타이머 0을프로세스 : com.me.cst, PID : 18897 java.lang.NullPointerException : 가상 메소드 'void com.me.interfaces.JsHandler.keepAliveStatusMessage (java.lang.String, java.lang.String, java. java.util.Timer $ TimerImpl.run에서 com.me.service.KeepAliveStatusMessageService $의 1.run (KeepAliveStatusMessageService.java:67) 에서 널 객체 참조 에 ') lang.String (Timer.java:284)

왜 JsHandler가 앱을 죽인 후에 null이되는지 알 수 없습니다. 서비스가 null이되는 경우에만 중단되지 않기 때문에 앱을 죽인 후 해당 메소드를 호출하도록 도와주세요. 모든 제안은 감사합니다 .. 사면 내 영어 ...

EDIT1 : JsHandler이 JsHandler.java 클래스의 비참한이다. 이 클래스는 거기에서 Java 스크립트 메소드를 호출하는 데 사용되며 네트워크 호출이 전송됩니다. 다음 내가 putExtra 방법을 통해 개체를 전달 할 수없는이기 때문에 나는 그것을 정적 변수를 만들어 LoginActivity.java 에 JsHandler의 정적 변수를 만든 JsHandler.java

public class JsHandler { 
    Activity activity; 
    WebView webView; 
    Handler handler = new Handler(); 
    public JsHandler(Activity _contxt, WebView _webView, Handler handler) { 
     activity = _contxt; 
     webView = _webView; 
     this.handler = handler; 
    } 
public void keepAliveStatusMessage(String ip, String username, String sessionId) { 
     final String webUrl = "javascript:keepAliveStatusMessage('" + ip + "','" + username + "','" + sessionId + "')"; 
     activity.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       webView.loadUrl(webUrl); 
      } 
     }); 
    } 
} 

JsHandler 클래스의 브리핑입니다 개시에있어서의

public static JsHandler javaSHandler; 

및 할당 된 값

javaSHandler = new JsHandler(this, loginWebView, new Handler()); 
01,

KeepAliveStatusMessage.java 클래스에서 정적 변수에 액세스하고 있습니다. 은 JsHandler 클래스의 keepAlive 메소드를 호출합니다.

답변

0

왜 JsHandler가 앱을 죽인 후에 null이되는지 알 수 없습니다.

프로세스가 종료되었습니다. 그런 다음 안드로이드는 끈적 거리는 서비스의 새로운 복사본을 만들기 위해 새로운 프로세스를 시작했습니다. 그러나이 새로운 프로세스에서 초기화되지 않는 static 필드 (GladiusLoginActivity.javaSHandler)를 참조하고 있습니다. 따라서 null이 될 것이므로 해당 객체의 메소드를 호출 할 때 충돌이 발생합니다.

+0

그래서이 문제를 해결할 수있는 방법이 있습니다. 싱글 톤 클래스를 사용해 보았지만 나에게 null을 제공했습니다. – MKY

+0

@MKY :'javaSHandler'가 무엇인지, 왜 그런지, 왜 싱글 톤인지, 왜 당신이 생각하는지 모릅니다. 그것은 존재할 것이다. 나는이 모든 봉사가 무엇인지 알지 못합니다. 아무 것도하지 않는 것처럼 보입니다. 그래서, 아마도 해결책은 서비스 자체를 제거하는 것입니다.그 외에, 당신이 질문을 편집하고 설명하지 않는 한, ** 당신을이 코드로 성취하고자하는 것에 대해 자세히 설명하지 않는 한, 나는 정말로 당신을 도울 수 없다. – CommonsWare

+0

@MKY : 확실히 서비스를 제거하십시오. 프로세스가 종료되면 ** WebView가 없어지므로 ** 서비스가 수행 할 내용이 없습니다. – CommonsWare