Android和Java:减少服务循环中的内存使用量

Android和Java:减少服务循环中的内存使用量,第1张

概述我有一个Android服务,该服务使用此线程每秒更新一次通知(评论并不真正相关):thread=newThread(){@Overridepublicvoidrun(){//PreparandolanotificacióndeSwapNotificationCompat.BuildernotificationSwap=newNotif

我有一个Android服务,该服务使用此线程每秒更新一次通知(评论并不真正相关):

thread = new Thread() {    @OverrIDe    public voID run() {        // Preparando la notificación de Swap        NotificationCompat.Builder notificationSwap =                new NotificationCompat.Builder(context)                        .setSmallicon(androID.R.drawable.ic_dialog_info)                        .setContentTitle("Notificator:");        notificationmanager notificationmanager =                (notificationmanager) getSystemService(Context.NOTIFICATION_SERVICE);        int notificationSwAPId = 1; // Todo: Asignar un ID que no sea "Magic number"        while (!stop) {            String swAPInfo = null;            try{ // Todo: free devuelve sIEmpre 4 líneas?                Process free = Runtime.getRuntime().exec("free");                BufferedReader freeOut =                        new BufferedReader(                                new inputStreamReader(new DatainputStream(free.getinputStream())));                free.waitFor();                freeOut.readline();                freeOut.readline();                freeOut.readline();                swAPInfo = freeOut.readline();            }catch(Exception e){                Log.e("ERROR", e.toString()); // Todo: Mejorar esto            }            Scanner scanner = new Scanner(swAPInfo); // Todo: Mejorar esto            String swAPInfo2 = null;            if (scanner.hasNext()) {                scanner.skip("Swap:");            }            if (scanner.hasNextInt()) {                /*swAPInfo2 = "Total: " + */scanner.nextInt();            }            if (scanner.hasNextInt()) {                swAPInfo2 = "Usado: " + scanner.nextInt();            }            if (scanner.hasNextInt()) {                swAPInfo2 += "\nlibre: " + scanner.nextInt();            }            // Notificando            notificationSwap.setContentText(swAPInfo2);            notificationmanager.notify(notificationSwAPId, notificationSwap.build());            // Intentando liberar memoria            //System.gc();            try {                Thread.sleep(new Integer(PreferenceManager.getDefaultSharedPreferences(context).getString("frecuency", "60000"))); // Todo: Mejorar esto            } catch (InterruptedException e){                Log.d("Notificator (Service)", "DetenIEndo el hilo durante la espera"); // Todo: Mejorar esto                // Todo: ¿Qué pasa si el hilo es interrumpIDo fuera del try/catch? Si pilla la interrupción no hace falta la variable stop            }        }    }};

问题是它使用大约20MB的内存,但是如果我取消注释“ //System.gc();”,该数字降低到大约3 / 4MB,那是很多垃圾.但是对我来说,每个循环运行整个垃圾收集器似乎效率不高,并且cpu使用率更高.

这就是为什么我不喜欢仅使用自动变量的c循环上的垃圾收集器,我不会遇到这个问题,但是我认为这样做可能会更好,因为我实际上并不习惯Java和AndroID.

因此,我的主要问题是,如何以一种更有效的方式降低内存使用率?我还将介绍在AndroID上更新通知的更好的方法,但我真正需要的是防止这种代码使用过多的内存.

更新:

答案表明我应该关闭流,扫描仪等,但我不确定这是否必要(关闭流和扫描仪无法解决问题),但我认为这不是问题,因为它们是被成功删除.

问题是它们在被删除之前就堆积了,我想在线程休眠之前而不是等待垃圾收集器之前将它们删除,而且据我所知,在Java中无法做到这一点,因此我需要一个更多的“垃圾收集器”友好”的方式.

解决方法:

最后,您可以执行以下 *** 作

 finally {try {    freeOut.close();} catch (IOException e) {    e.printstacktrace();}
总结

以上是内存溢出为你收集整理的Android和Java:减少服务循环中的内存使用量全部内容,希望文章能够帮你解决Android和Java:减少服务循环中的内存使用量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1095569.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存