您的位置:首页 > 移动开发 > Android开发

Android计时器加弱引用

2016-03-07 12:11 537 查看
package com.example.ttt;

import java.lang.ref.WeakReference;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends Activity {
/**
* 网页链接超时时长(秒)
*/
private static final int TIME_OUT =5;

private MyHandler mHandler;
/**
*
* @author dell
*
*延伸:什么是WeakReference?
*WeakReference弱引用,与强引用(即我们常说的引用)相对,它的特点是:
*GC在回收时会忽略掉弱引用,即就算有弱引用指向某对象,但只要该对象没有被强引用指向(实际上多数时候还要求没有软引用,但此处软引用的概念可以忽略),
*该对象就会在被GC检查到时回收掉。对于下面的代码,用户在关闭Activity之后,就算后台线程还没结束,但由于仅有一条来自Handler的弱引用指向Activity,
*所以GC仍然会在检查的时候把Activity回收掉。这样,内存泄露的问题就不会出现了。
*
*弱引用-->随时可能会被垃圾回收器回收,不一定要等到虚拟机内存不足时才强制回收。要获取对象时,同样可以调用get方法。
*简单来说,就是只要使用了WeakReference,GC在检查的时候就会回收
*/
private static class MyHandler extends Handler {

private WeakReference<MainActivity> mActivity;

public MyHandler(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}

@Override
public void handleMessage(Message msg) {
MainActivity activity = mActivity.get();
if (activity == null) {
return;
}
switch (msg.what) {
case 1:
Log.d("myf", "==");
//              第一种情况
break;
case 2:
//              第二种情况
Toast.makeText(activity, "有", 3).show();
break;
default:
//              其他
break;
}
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new MyHandler(this);
CountdownThread countdownThread=new CountdownThread();
countdownThread.start();
}

/**
* 倒计时线程类
* @author dell
*
*/
class CountdownThread extends Thread {
/**
* 判断该线程是否继续
*/
private boolean isTrue = true;
/**
* 停止该线程
*/
public void stopRun() {
this.isTrue = false;
}

public void run() {
int time = 1;
while (time <= TIME_OUT && isTrue ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
time++;
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
if (time >= TIME_OUT) {
Message msg2 = new Message();
msg2.what = 2;
mHandler.sendMessage(msg2);
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: