2017-02-11 230 views
0

我在START_STICKY模式如何殺死

以下的服務創建的應用程序後,堅持在服務對象和變量是我的服務類

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。在com.me.service.KeepAliveStatusMessageService $ 1.run(KeepAliveStatusMessageService.java:67) 上的空對象引用 lang.String)」在java.util.Timer中$ TimerImpl.run(Timer.java:284)

我不知道爲什麼JsHandler殺死應用程序後變爲空。 請幫助我在殺死應用程序後調用該方法,因爲服務未被中止只有該值變爲空。 任何建議表示讚賞.. 請原諒我的英語...

EDIT1: JsHandler是下賤JsHandler.java類的。這個類用來調用從那裏網絡調用將被髮送的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的靜態變量LoginActivity.java 我做了靜態變量,因爲我不能夠通過putExtra方法傳遞對象在啓動方法

public static JsHandler javaSHandler; 

和分配值

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

在KeepAliveStatusMessage.java類中,我正在訪問該靜態變量。 來調用JsHandler類的keepAlive方法。

回答

0

我不知道爲什麼JsHandler殺死應用程序後變爲空。

您的流程已終止。然後,Android爲您啓動一個全新的流程,開始您的粘性服務的全新副本。但是,您指的是static字段(GladiusLoginActivity.javaSHandler),該字段在此新過程中不會被初始化。因此,當您嘗試調用該對象上的方法時會崩潰,因爲它將是null

+0

所以有辦法解決這個問題 我試過Singleton類,但是給我空 – MKY

+0

@MKY:我不知道什麼'javaSHandler'是什麼,它做什麼,爲什麼它是一個單身人士,爲什麼你認爲它會存在。我甚至不知道這整個服務是什麼,因爲它似乎沒有做任何事情。所以,也許解決辦法是擺脫服務本身。除此之外,我不能真正幫助你,除非你編輯你的問題並詳細解釋,**詳細說明**,你試圖用這個代碼來完成什麼。 – CommonsWare

+0

@MKY:肯定會擺脫服務。當你的進程終止時,**你的'WebView'不見了**,所以服務沒有任何事情可做。 – CommonsWare