Android计时器加弱引用

来源:互联网 发布:怎么在淘宝找客户资料 编辑:程序博客网 时间:2024/05/21 08:59
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);                }            }        }    }}
0 0
原创粉丝点击