0

ネットワークが利用できない場合、私のAndroidアプリは5〜10分以内にバックグラウンドで強制終了されました。

アプリは常にバックグラウンドでいくつかのRESTサービスを呼び出します。

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

ありがとう

4

1 に答える 1

1

ネットワークが利用できない場合、私のAndroidアプリは5〜10分以内にバックグラウンドで強制終了されました

Activityこれは、アプリにforgroundまたはforgroundServiceインスタンスがない場合に発生すると想定されることです。これは、アプリがバックグラウンドで消費するメモリの量にも依存します。大量のメモリを消費する場合、OSはアプリを優先度の高いものにして最初に「強制終了」します。

このGoogleIOビデオでは、このような状況でアプリが強制終了される可能性がある場合について詳しく説明しています-http://www.youtube.com/watch?v=gbQb1PVjfqM&list=PL4C6BCDE45E05F49E&index=10&feature= plpp_video

ビデオの途中でこの問題について話し合うのは2、3分です

アプリは常にバックグラウンドでいくつかのRESTサービスを呼び出します

androidクラスからRESTメソッドの呼び出しを行っていない場合は、実行するService必要があります。これは、前述したように、アクティビティがforgroundでない場合、またはforgroundサービスが実行されていない場合、OSがプロセスを非常に高速に強制終了するためです。

とにかく、バックグラウンドで長期間ネットワーク操作を行うバックグラウンドサービスを実行することは悪い考えです。それは大量のバッテリーと3G帯域幅を消費します。ユーザーは、バッテリーの消耗に気付いた後、アプリを非常に速く削除します。だからあなたはバックグラウンドでやりすぎないように気をつけるべきです

于 2013-02-01T12:00:10.610 に答える