我在Java中的总的初学者和已经创建了一个简单的Java的Android片断其中一个Runnable 1,5秒钟后,我改变TextView从Hello

World到Hola

Mundo。它工作正常,基本上WeakReference应该防止这种内存泄漏发生吗?我怀疑在发生设备定向时是否绝对没有内存泄漏。我很乐意对此进行检查,但无法在模拟的Android中更改方向。

这是代码:

package com.example.helloworld;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.widget.TextView;

import android.util.Log;

import java.lang.ref.WeakReference;

public class HelloWorldActivity extends Activity

{

private Handler h = new Handler();

private static TextView txtview;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

txtview = (TextView) findViewById(R.id.mainview);

h.postDelayed(new WeakRunnable(txtview),1500);

}

private static final class WeakRunnable implements Runnable {

private final WeakReference mtextview;

protected WeakRunnable(TextView textview){

mtextview = new WeakReference(textview);

}

@Override

public void run() {

TextView textview = mtextview.get();

if (textview != null) {

txtview.setText("Hola Mundo");

textview = null; // No idea if setting to null afterwards is a good idea

}

Log.d("com.example.helloworld", "" + textview);

}

}

}

编辑

它可以防止内存泄漏,但也有一些答案与UI线程阻塞有关。实际上,此代码在主(UI)线程中运行处理程序。要产生一个新线程,我要手动产生一个线程,如下所示:

package com.example.helloworld;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.widget.TextView;

import android.util.Log;

import java.lang.ref.WeakReference;

public class HelloWorldActivity extends Activity

{

private static TextView txtview;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

txtview = (TextView) findViewById(R.id.mainview);

Thread t = new Thread(new WeakRunnable(txtview));

t.start();

}

private static final class WeakRunnable implements Runnable {

private final WeakReference mtextview;

protected WeakRunnable(TextView textview){

mtextview = new WeakReference(textview);

}

@Override

public void run() {

TextView textview = mtextview.get();

if (textview != null) {

/*

try {

Thread.sleep(1500);

} catch (InterruptedException e) {

e.printStackTrace();

}

*/

txtview.setText("Hola Mundo");

textview = null;

}

Log.d("com.example.helloworld", "" + Thread.currentThread().getName()); // Outputs "Thread-" if not running on UI thread

}

}

}

现在的问题是,我似乎无法以任何方式延迟生成的线程,否则它将起作用。

这个:

try {

Thread.sleep(1500);

} catch (InterruptedException e) {

e.printStackTrace();

}

使应用本身退出,我不明白为什么。某事告诉我,我以错误的方式延迟了它。

编辑2

感谢@EugenMatynov给我的链接:从android中的另一个线程更新ui,我理解了为什么退出该应用程序。归结为 您不能从主线程以外的线程调用UI方法 的原因

。 并且从另一个线程更新UI是一种不好的做法。

android runnable内存泄漏,这个Runnable可以防止内存泄漏吗?相关推荐

  1. Android开发笔记之:Handler Runnable与Thread的区别详解

    From:http://www.jb51.net/article/37465.htm 本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友 ...

  2. 【转】android如何查看cpu的占用率和内存泄漏

    原文网址:http://www.cnblogs.com/yejiurui/p/3472765.html 在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程 ...

  3. 【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

    文章目录 一. 报错信息 二. 内存排查 三. 代码分析及修改 四. 不同版本说明 参考以下博客 : [Android 内存优化]Android Profiler 工具常用功能 ( 监测内存 | 内存 ...

  4. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

  5. android如何查看cpu的占用率和内存泄漏

    在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程度上很重要,经过查询资料,研究了一下,暂时了解到大概有以下几种方式,如果哪位高手有更好的办法,或者文中描 ...

  6. 手写Android性能监测工具,支持Fps/流量/内存/启动等

    App性能如何量化: 如何衡量一个APP性能好坏?直观感受就是:启动快.流畅.不闪退.耗电少等感官指标,反应到技术层面包装下就是:FPS(帧率).界面渲染速度.Crash率.网络.CPU使用率.电量损 ...

  7. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言       原文:[朝花夕拾]Android性能篇之(二)Java内存分配        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...

  8. Android异常与性能优化相关面试问题-内存管理面试问题详解

    内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...

  9. Android进程守护,让APP在系统内存中常驻(二)

    昨天晚上写了用系统服务等方法来实现应用保活.今天写一下用提高app的进程等级来实现应用保活.想看直接调用系统方法保活应用的可以点击Android进程守护,让APP在系统内存中常驻(一)进行跳转. 一: ...

  10. Android 内存优化实操,定位内存问题

    文章目录 一.内存泄漏定位 1.观察法: 2.使用内存分析工具 2-1.收集内存快照 2-2.hprof文件转换 2-3.Mat分析内存 二.内存抖动 三.优化内存空间 1.减少不必要的内存开销 2. ...

最新文章

  1. 4.11 一维到三维推广-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  2. MySQL文件后_MySQL误删除文件后,如何恢复
  3. zoj 1074 To the MAX
  4. 程序员在互联网公司和行业软件公司工作,有什么区别?
  5. 移动web开发-------meta
  6. 深度解读 | ElasticDL 深度学习框架简化编程,提升集群利用率和研发效率的秘诀...
  7. Shell中判断文件,目录是否存在
  8. 查看linux系统版本,内核,CPU,MEM,位数的相关命令
  9. 史上最细IDEA搭建基于SSM(springmvc+spring+mybatis)
  10. 05 基本数据类型+五大数据类型
  11. BZOJ1034: [ZJOI2008]泡泡堂BNB
  12. 基于单片机的有害气体/空气质量监测系统设计(#0422)
  13. CSR1010A05-IQQM-R首款单模单芯片蓝牙低功耗
  14. 如何利用Social Listening从社会化媒体中“提炼”有价值的信息?
  15. SIP音调通话调研结果
  16. DIY微信朋友圈截图制作生成小程序源码下载
  17. php如何配置gii,yii2 框架使用gii工具创建模块
  18. editplus里python技巧_editplus调试python
  19. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息
  20. matlab中函数参数和变量作用域

热门文章

  1. Docker学习总结(50)——Docker 微服务优雅关闭
  2. 消息中间件学习总结(13)——Kafka与RocketMQ的单机系统可靠性比较分析
  3. python抢红包random实现_python写红包的原理流程包含random,lambda其中的使用和见简单介绍...
  4. 富士康java应届生工资待遇_应届毕业生入职富士康渠道不一样,收入相差悬殊...
  5. java 给数组添加删除数_Java实现数组的添加、删除、查找(基础型)
  6. BZOJ2801/洛谷P3544 [POI2012]BEZ-Minimalist Security(题目性质发掘+图的遍历+解不等式组)...
  7. linux下安装rar解压包
  8. 301重定向错误(细心就不应该出错)
  9. oracle获取SID
  10. 中继链路,以太网通道,DHCP配置