2013-02-01 49 views
0

如果網絡不可用,我的android應用在5到10分鐘內就會在後臺死亡。如果網絡不可用,Android應用在後臺死亡

應用程序不斷地在後臺調用一些休息服務。

我沒有得到任何異常在我的logcat。

但是,當我回到前臺時,我的應用程序從開始就開始,因爲它被OS所殺。

請告訴我可能是什麼原因以及我該怎麼做才能阻止它。

public void sendHttpPost() throws ClientProtocolException, IOException{ 
     HttpPost httpPostRequest = new HttpPost(url + buildParams()); 

     // add headers 
     HttpParams httpParams = new BasicHttpParams(); 
     Iterator it = headers.entrySet().iterator(); 
     Iterator itP = params.entrySet().iterator(); 
     while (it.hasNext()) { 
      Entry header = (Entry) it.next(); 
      httpPostRequest.addHeader((String)header.getKey(), (String)header.getValue()); 
     } 
     while(itP.hasNext()) 
     { 
      Entry header = (Entry) itP.next(); 
      StringEntity se = new StringEntity((String) header.getValue()); 
      httpPostRequest.setEntity(se); 
     } 
     HttpConnectionParams.setConnectionTimeout(httpParams, 30000); 
     HttpConnectionParams.setSoTimeout(httpParams, 30000); 
     httpPostRequest.setParams(httpParams); 
     HttpClient client = new DefaultHttpClient(); 
     HttpResponse resp; 

     resp = client.execute(httpPostRequest); 

     this.respCode = resp.getStatusLine().getStatusCode(); 
    // Log.i(TAG, "response code: " + getResponseCode()); 
     this.responsePhrase = resp.getStatusLine().getReasonPhrase(); 
    // Log.i(TAG, "error msg: " + getErrorMsg()); 
     HttpEntity entity = resp.getEntity(); 

     if (entity != null){ 
      InputStream is = entity.getContent(); 
      //Header contentEncoding = resp.getFirstHeader("Content-encoding"); 
      //Log.i(TAG, "endoding" + contentEncoding.getValue()); 
      response = convertStreamToString(is); 
      //response = response.substring(1,response.length()-1); 
      //response = "{" + response + "}"; 
    //  Log.i(TAG, "response: " + response); 
      screen.update("Login", response, false); 
      is.close(); 
     } 
    } 

這是與服務器即使網絡不可用

以下是其中一個線程調用REST服務代碼交互的方法。

如何做相同的服務:

public void start() 
    { 
     try{ 

      if(_exit) 
       return;  
      //_lastExecute = System.currentTimeMillis(); 
      _try++; 
     // Log.i("-----HK Requests--------- \n\r", _url); 
      final String response = HttpConnector.callWebService(_url, _data, _listener, _token); 

      CallBackThread ct = new CallBackThread(_action, response, autocallreq); 
      ct.start();   
//   while(ct.isAlive()) 
//   { 
//    Thread.sleep(500); 
//   } 
     }   

     catch(Exception e) 
     { 
      System.out.print("error="+e.getMessage()); 
      Helper.LogException(this, e); 
      //CallBackThread ct = new CallBackThread(_action, "", autocallreq); 
      //ct.start(); 
     } 
    } 

感謝

+0

你是否嘗試通過網絡發送的東西,如果它可用?然後檢查你的應用程序是否嘗試發送,即使網絡不可用... – Ekonion

+0

請分享一些代碼,以便我們可以理解你的問題究竟是什麼 – Alpay

+0

你是什麼意思的背景?你是否在Service或Thread對象中運行代碼? –

回答

1

我的Android應用得到了在後臺5到10分鐘內殺死,如果網絡沒有availabale

那是什麼假設在您的應用沒有任何forground Activity或forground Service實例時發生。這也取決於你在後臺消耗多少內存 - 如果消耗大量內存,操作系統會將你的應用置於高優先級,首先被「殺死」。

這個谷歌IO視頻詳細解釋了,當你的應用程序可以在這種情況下被殺死 - http://www.youtube.com/watch?v=gbQb1PVjfqM&list=PL4C6BCDE45E05F49E&index=10&feature=plpp_video

這兩三分鐘的視頻

應用不斷調用中間討論過這個問題你應該這樣做,因爲正如我所說的 - 在後臺

,如果你不這樣做從Android Service類的REST方法的調用一些休息服務 - 如果沒有活動是forground或沒有forground服務正在運行,操作系統將非常快速地殺死你的進程,

我必須說運行後臺服務,在很長一段時間內在後臺執行網絡操作 - 無論如何是一個壞主意:它將消耗大量電池,並且還會消耗3G帶寬。用戶會在他們意識到電池耗盡後快速刪除您的應用。所以你應該從後臺做太多

+0

我編輯了問題 –

+0

@Ankit HTech:所以我是對的,你沒有使用服務類。我建議你按照我在回答中所說的來做 –

+0

謝謝你提示我,但是如何做到這一點我是新的安卓系統請告訴我 –

相關問題