Dans mon application, j'atteindra les données du serveur sous forme de JSON. Les données sont d'environ 1,5 Mo. L'application fonctionne mais parfois il se bloque lors de la récupération de données de serveur donnant à OutofMemoryError.
Ceci est ma méthode: p>
10-23 03:39:25.271: E/dalvikvm-heap(1011): Out of memory on a 4116282-byte allocation. 10-23 03:39:25.271: I/dalvikvm(1011): "AsyncTask #1" prio=5 tid=11 RUNNABLE 10-23 03:39:25.271: I/dalvikvm(1011): | group="main" sCount=0 dsCount=0 obj=0x417c5e88 self=0x2a1d1db8 10-23 03:39:25.271: I/dalvikvm(1011): | sysTid=1025 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=706552328 10-23 03:39:25.271: I/dalvikvm(1011): | state=R schedstat=( 3053328788 23773807212 6541 ) utm=241 stm=64 core=0 10-23 03:39:25.271: I/dalvikvm(1011): at java.lang.String.<init>(String.java:~422) 10-23 03:39:25.271: I/dalvikvm(1011): at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642) 10-23 03:39:25.282: I/dalvikvm(1011): at java.lang.StringBuilder.toString(StringBuilder.java:663) 10-23 03:39:25.282: I/dalvikvm(1011): at com.dzo.redacted.driverapp.datalayer.ServerConnect.sendPostRequest(ServerConnect.java:128) 10-23 03:39:25.282: I/dalvikvm(1011): at com.dzo.redacted.driverapp.datalayer.ServerConnect.Sync(ServerConnect.java:61) 10-23 03:39:25.282: I/dalvikvm(1011): at com.dzo.redacted.driverapp.datalayer.DBSync.Login(DBSync.java:59) 10-23 03:39:25.282: I/dalvikvm(1011): at com.dzo.redacted.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:52) 10-23 03:39:25.282: I/dalvikvm(1011): at com.dzo.redacted.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:1) 10-23 03:39:25.282: I/dalvikvm(1011): at android.os.AsyncTask$2.call(AsyncTask.java:287) 10-23 03:39:25.282: I/dalvikvm(1011): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 10-23 03:39:25.282: I/dalvikvm(1011): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 10-23 03:39:25.282: I/dalvikvm(1011): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 10-23 03:39:25.282: I/dalvikvm(1011): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 10-23 03:39:25.282: I/dalvikvm(1011): at java.lang.Thread.run(Thread.java:841) 10-23 03:39:25.282: W/dalvikvm(1011): threadid=11: thread exiting with uncaught exception (group=0x41465700) 10-23 03:39:25.292: I/Choreographer(1011): Skipped 30 frames! The application may be doing too much work on its main thread. 10-23 03:39:25.491: E/AndroidRuntime(1011): FATAL EXCEPTION: AsyncTask #1 10-23 03:39:25.491: E/AndroidRuntime(1011): java.lang.RuntimeException: An error occured while executing doInBackground() 10-23 03:39:25.491: E/AndroidRuntime(1011): at android.os.AsyncTask$3.done(AsyncTask.java:299) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 10-23 03:39:25.491: E/AndroidRuntime(1011): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.lang.Thread.run(Thread.java:841) 10-23 03:39:25.491: E/AndroidRuntime(1011): Caused by: java.lang.OutOfMemoryError 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.lang.String.<init>(String.java:422) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.lang.StringBuilder.toString(StringBuilder.java:663) 10-23 03:39:25.491: E/AndroidRuntime(1011): at com.dzo.redacted.driverapp.datalayer.ServerConnect.sendPostRequest(ServerConnect.java:128) 10-23 03:39:25.491: E/AndroidRuntime(1011): at com.dzo.redacted.driverapp.datalayer.ServerConnect.Sync(ServerConnect.java:61) 10-23 03:39:25.491: E/AndroidRuntime(1011): at com.dzo.redacted.driverapp.datalayer.DBSync.Login(DBSync.java:59) 10-23 03:39:25.491: E/AndroidRuntime(1011): at com.dzo.redacted.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:52) 10-23 03:39:25.491: E/AndroidRuntime(1011): at com.dzo.redacted.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:1) 10-23 03:39:25.491: E/AndroidRuntime(1011): at android.os.AsyncTask$2.call(AsyncTask.java:287) 10-23 03:39:25.491: E/AndroidRuntime(1011): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 10-23 03:39:25.491: E/AndroidRuntime(1011): ... 4 more 10-23 03:39:28.091: E/WindowManager(1011): Activity com.dzo.redacted.driverapp.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{4178fcb0 V.E..... R.....ID 0,0-479,96} that was originally added here 10-23 03:39:28.091: E/WindowManager(1011): android.view.WindowLeaked: Activity com.dzo.redacted.driverapp.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{4178fcb0 V.E..... R.....ID 0,0-479,96} that was originally added here 10-23 03:39:28.091: E/WindowManager(1011): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345) 10-23 03:39:28.091: E/WindowManager(1011): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239) 10-23 03:39:28.091: E/WindowManager(1011): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 10-23 03:39:28.091: E/WindowManager(1011): at android.app.Dialog.show(Dialog.java:281) 10-23 03:39:28.091: E/WindowManager(1011): at com.dzo.redacted.driverapp.asynctask.SyncDBTask.onPreExecute(SyncDBTask.java:43) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.AsyncTask.execute(AsyncTask.java:534) 10-23 03:39:28.091: E/WindowManager(1011): at com.dzo.redacted.driverapp.asynctask.LoginAsyncTask.onPostExecute(LoginAsyncTask.java:87) 10-23 03:39:28.091: E/WindowManager(1011): at com.dzo.redacted.driverapp.asynctask.LoginAsyncTask.onPostExecute(LoginAsyncTask.java:1) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.AsyncTask.finish(AsyncTask.java:631) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.AsyncTask.access$600(AsyncTask.java:177) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.Handler.dispatchMessage(Handler.java:99) 10-23 03:39:28.091: E/WindowManager(1011): at android.os.Looper.loop(Looper.java:137) 10-23 03:39:28.091: E/WindowManager(1011): at android.app.ActivityThread.main(ActivityThread.java:5103) 10-23 03:39:28.091: E/WindowManager(1011): at java.lang.reflect.Method.invokeNative(Native Method) 10-23 03:39:28.091: E/WindowManager(1011): at java.lang.reflect.Method.invoke(Method.java:525) 10-23 03:39:28.091: E/WindowManager(1011): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 10-23 03:39:28.091: E/WindowManager(1011): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 10-23 03:39:28.091: E/WindowManager(1011): at dalvik.system.NativeStart.main(Native Method) 10-23 03:44:25.761: I/Process(1011): Sending signal. PID: 1011 SIG: 9
3 Réponses :
Essayez comme ça,
private String sendPostRequest(String url, List<NameValuePair> params) throws Exception { String ret = null; BufferedReader bufferedReader = null; HttpClient httpClient = new DefaultHttpClient(); HttpPost request = new HttpPost(url); try { UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params); request.setEntity(entity); HttpResponse response = httpClient.execute(request); bufferedReader = new BufferedReader(new InputStreamReader(response .getEntity().getContent())); String line = ""; while ((line = bufferedReader.readLine()) != null) { ret =ret +line; } bufferedReader.close(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } return ret; }
N'a pas travaillé ... Toujours en train de devenir exceptionnel pour la même raison
Pouvez-vous perdre une lumière sur la recherche de mal dans l'approche ci-dessus?
@Nitish the StringBuilder est toujours là, mais est caché dans une chaîne + code>.
Si vous n'avez pas assez de mémoire pour stocker votre chaîne, vous pouvez: libérer de la mémoire, réduire la consommation de mémoire et ne stockez pas la chaîne en mémoire. P>
Dans votre cas, vous avez besoin: p>
Options: p>
Merci d'avoir souligné le bogue. J'avais opté pour la 3ème solution. Ça fonctionne bien.
Monsieur, cela signifie-t-il si je passe directement une intrigue à GSON elle-même, je ne ferais pas la confrontée à l'exception OOM qui prend des endroits lors de l'utilisation d'un constructeur à cordes? Veuillez aider. Merci
Je ne comprends pas comment un appareil avec 512 Mo de RAM et beaucoup de gèlement libre peut avoir du mal à affecter une pautrie 6 ou 8 Mo pour une chaîne.
Bonjour Leonidos / Nitish, pouvez-vous me donner un lien de référence pour la 3ème option?
Il suffit d'ajouter ceci au
Ce n'est pas une solution, cela masque le problème.
Peut-être que [this] [1] résoudra votre problème. [1]: Stackoverflow.com/Questtions/8359693/...
Merci mais l'application fonctionnera sur les téléphones et les tablettes, donc je ne peux donc pas augmenter la taille du tas d'un téléphone.