如果网络不可用,Android应用程序在后台被杀死

时间:2013-02-01 11:49:19

标签: android

如果网络不可用,我的Android应用程序会在5到10分钟内在后台被杀。

App经常在后台调用一些休息服务。

我的logcat中没有任何异常。

但当我回到前台时,我的应用程序从开始就开始,因为它被操作系统杀死了。

请建议我可能是什么原因,我该怎么做才能阻止它。

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();
        }
    }

谢谢

1 个答案:

答案 0 :(得分:1)

  

如果网络不可用,我的Android应用程序会在5到10分钟内在后台被杀死

当您的应用没有任何forground Activity或forground Service实例时,就会发生这种情况。 这也取决于你在后台使用多少内存 - 如果消耗大量内存,操作系统会将你的应用程序置于高优先级,首先被“杀死”。

此Google IO视频详细说明了在这种情况下您的应用何时被杀 - http://www.youtube.com/watch?v=gbQb1PVjfqM&list=PL4C6BCDE45E05F49E&index=10&feature=plpp_video

在视频中间讨论这个问题的时间是两三分钟

  

App经常在后台调用一些休息服务

如果你没有从android Service类调用REST方法 - 你应该这样做,因为正如我所说的 - 如果没有Activity forground或没有forground Service,操作系统会很快杀死你的进程正在运行,

我必须说在后台进行长时间网络操作的运行后台服务 - 无论如何都是一个坏主意:它会消耗大量电池,还会消耗3G带宽。用户将意识到它耗尽电池后会非常快速地删除你的应用。所以你应该在背景中做太多的小事