ExecutorService Duplica memoria in API26 Android [chiuso]

1

La mia app scarica dati da un server PHP utilizzando thread da un ExecutorService con dimensione ThreadPool 4. Nell'API 27, l'app funziona perfettamente senza causare alcuna eccezione OOM dalla memoria Heap. Ma tutte le API precedenti < 26 lancia OOM.

Di seguito è riportato un semplice esempio di codice che esegue 134 richieste e quindi aggiunge la risposta al pool. Nella API 27 la dimensione massima dell'Heap raggiunge i 68 mb. Ma quando lo eseguo con API 19,21,25 e.t.c, la dimensione massima dell'heap raggiunge 123 mb.

Quando rimuovo il Log.d ("Process response", (response) + ""); nell'API 27 la dimensione dell'heap scende a 10mb. Ma con l'API 19, la dimensione dell'heap va a 60mb.

Non capisco perché raddoppia le dimensioni. Sembra che nell'API 19 e oltre aumenti la memoria quando si aggiungono attività nel pool e anche quando si tiene il riferimento nella variabile di risposta.

Qualche suggerimento?

Nota Il thread sleep è solo per l'esempio per vedere la dimensione massima dell'heap

Grazie

private ActivityManager activityManager;
ExecutorService service  = Executors.newFixedThreadPool(4);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    activityManager= (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);;

    final  RequestQueue queue = Volley.newRequestQueue(this);
    String url =".....";
    for(int i =0 ; i<134 ; i++) {
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        method(response);  //0.5mb
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("VolleyError", error.toString());
            }
        });
        queue.add(stringRequest);
    }

}


public void method(final String response){
        Runnable task = new Runnable() {
            @Override
            public void run() {
                try {
                    Log.d("Process response", (response)+"");
                    Thread.sleep(200000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        logHeap("");
        service.execute(task);
}
    
posta Nick 01.07.2018 - 12:34
fonte

0 risposte

Leggi altre domande sui tag