2016-05-18 2 views
0

Я звоню RESTFUL API. Я использую библиотеки весны. Но я получаю этот OutOfMemoryError, когда выполняется restTemplate.exchange. Ниже приведен фрагмент кода и журнал ошибок. Я использую этот код для получения данных с сервера с помощью webservices. На некоторых устройствах это работает отлично, но несколько устройств вызывают исключение.ошибка android из памяти

FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); 
     formHttpMessageConverter.setCharset(Charset.forName("UTF8")); 
     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); 
     restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 
     restTemplate.getMessageConverters().add(formHttpMessageConverter); 
     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
     restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 
     MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
     DeviceInfo deviceInfo = new DeviceInfo(mContext); 

     map.add("organizationId", "0"); 
     map.add("groupCode", securityCode); 
     map.add("deviceId", deviceInfo.getDeviceID()); 
     map.add("version_code", deviceInfo.getVersionCode() + ""); 
     map.add("freshDataLoad", mode); 
     HttpHeaders headers = new HttpHeaders(); 
     HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<MultiValueMap<String, String>>(map, headers); 
     ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 
     String respStr = responseEntity.getBody(); 

Ниже журнал ошибок

java.lang.OutOfMemoryError 
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:124) 
at java.lang.StringBuffer.append(StringBuffer.java:278) 
at java.io.StringWriter.write(StringWriter.java:123) 
at org.springframework.util.FileCopyUtils.copy(FileCopyUtils.java:189) 
at org.springframework.util.FileCopyUtils.copyToString(FileCopyUtils.java:240) 
at org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:107) 
at org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:44) 
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147) 
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:98) 
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:743) 
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:728) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:549) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:504) 
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:452) 
at com.example.testapp.sync.SyncStrategy.getTestData(SyncStrategy.java: 
at com.example.testapp.sync.SyncWorker$2.run(SyncWorker.java:126) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.os.HandlerThread.run(HandlerThread.java:61) 
+0

Каковы различия в спецификации памяти. между устройствами, где он работает, и другими, где нет? Для jvm может потребоваться расширение памяти. –

+0

Возможно, ответ слишком велик. Попробуйте загрузить данные по частям или использовать потоки. – user1516873

+0

На вкладке micromax он отлично работает, но на вкладке samsung он выдает ошибку, и на вкладках есть 1 ГБ оперативной памяти и 1,3 ГГц процессор – user3500873

ответ

0

Это может случится, как ваше приложение потребляет много памяти. Попробуйте оптимизировать код приложения.

Кроме того, может помочь трюк: попробуйте явно вызвать сборщик мусора, прежде чем обращаться с этим запросом, что требует большой памяти.

Звонок: Runtime.getRuntime(). Gc(); для вызова сборщика мусора.

См ссылке: How to resolve out of memory issue