1、Handler的封装
封装handler:
/**
* 软引用的Handler
*/
class MyHandler(mActivity: Activity, mListen: (Message?) -> Unit) : Handler() {
private var mWeakReference: WeakReference<Activity> = WeakReference(mActivity)//添加弱引用
private var mListen=mListen
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
if (mWeakReference.get() != null) {
mListen(msg)
}
}
}
MainActivity:
class MainActivity : AppCompatActivity() {
var myHandler = MyHandler(this) {
Log.d("WY+", "it的数据为:$it")
when (it!!.what) {
1 -> {
Log.d("WY+", "延时执行了")
}
2 -> {
Log.d("WY+", "字符串数据为:" + it.obj)
}
3 -> {
Log.d("WY+", "更新UI:" + it.obj)
tv_1.text = it.obj.toString()//此处不用使用runOnUiThread
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//第一种(延时)
myHandler.sendEmptyMessageDelayed(1, 5000)
//第二种(发送数据)
var message: Message = myHandler.obtainMessage()
message.what = 2
message.obj = "字符串数据666"
myHandler.sendMessage(message)
//第3种(发送数据并且更新UI)
var message1: Message = myHandler.obtainMessage()
message1.what = 3
message1.obj = "更新UI数据:000"
myHandler.sendMessage(message1)
}
}
避免oom的方法有两种:
1、弱引用(如上)
2、在ondestroy里面调用handler.removeCallbacksAndMessages(null);
demo的下载地址为:
https://download.csdn.net/download/wy313622821/12265063
结束!!!!
2、handle不造成内存泄漏的示例
private Handler mHandler = new Handler(Looper.getMainLooper());
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
// 运行的方法
try {
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
调用
mHandler.postDelayed(mRunnable, 5000);
释放(一般在ondestory里)
mHandler.removeCallbacks(mRunnable);
3、new匿名实例是否会造成内存泄漏或崩溃
- 在Android中,创建多个匿名实例通常不会导致内存泄漏或崩溃,但这取决于实例的具体使用方式。
- 如果您创建多个匿名实例并将它们存储在全局范围内,例如静态变量中,这可能会导致内存泄漏。这是因为每个实例都持有对它自己的引用,所以如果这些实例永远不会被清除,它们就会一直存在于内存中。
- 另一方面,如果您只是在短时间内使用匿名实例,并且不会将它们存储在任何全局变量中,那么它们就不会导致内存泄漏或崩溃。
- 总的来说,最好的做法是根据代码需求和性能需求来决定是否需要使用匿名实例,并确保在使用它们时正确地处理它们。
举个例子:
new Handler().postDelayed(new Runnable() { @Override public void run() { // 延时执行的代码 } }, 2000);
以上代码不会导致内存泄漏。因为在postDelayed()方法中传递的Runnable对象是匿名内部类,它不会持有外部类的引用。当延迟时间到达时,Runnable对象会被Handler处理并执行,然后被垃圾回收器回收。因此,不会发生内存泄漏。