扣丁学堂——handler

来源:互联网 发布:asp.net 4.5 高级编程 编辑:程序博客网 时间:2024/04/28 16:20

一丶代码见本文

二丶课程讲解







这里一个小例子帮助理解handler机制

//多线程之间进行通信 使用handler/*** * * handler 机制 * 1.Message 消息对象,内部使用链表数据结构实现一个消息池,用于重复利用,避免大量创建对象,造成内存浪费 * * 2.Handler 消息处理者,通过该对象把消息存入消息队列,并最后通过 handlerManager 方法处理消息 * * 3.MessageQueue 消息队列,用于存储 Message 对象的数据结构,先进先出 * * 4.Looper 消息队列的处理者,用于循环检查消息队列 从消息队列中一个一个的取出消息对象,传入 handlerMessage 方法处理 * * */public class MainActivity extends AppCompatActivity {    TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView = (TextView) findViewById(R.id.textView);    }    //传递消息的对象    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            new Thread(new Runnable() {                @Override                public void run() {                    while (true) {                        try {                            Thread.sleep(3000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        break;                    }                    //发个消息标记,消息内容为空                    handler.sendEmptyMessage(100);                    Message msg = handler.obtainMessage();//获取一个消息对象                    msg.what = 100;//消息标记                    msg.obj = "要存储的信息"; //可以存放任意类型的数据                    handler.sendMessage(msg);//发送消息                    handler.sendEmptyMessageAtTime(200, System.currentTimeMillis() + 300);//在指定时间后发送消息                    handler.sendEmptyMessageDelayed(300, 2000);//延迟多长时间后发送消息                }            }).start();        }    };}



这里相当于提供一个API标准例子,以后会用到

/** * handleer 的内存泄露问题 * * 1. 定义一个内部类部类时,会默认拥有外部类对象的引用,所以建义使用内部类时,最好定义为一个静态内部类 * * 2.引用的强弱: 强引用--->>软引用---->>弱引用 */public class HandlerActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_handler);        //使用handler 延迟一个Runnable 任务 10分钟        handler.postDelayed(new Runnable() {            @Override            public void run() {                Log.i("msg", "一个任务开始执行");            }            ;        }, 1000 * 60 * 10);        finish();//关闭当前的activity    }    //避免handler内存泄露 原因:因为这前的写法 activity 退出了,但    //Handler 还在引用activity,导致不能退出,继续在占用内存,并运行中    private  MyHandler handler = new MyHandler(this);    private static class MyHandler extends  Handler{        //定义弱引用        WeakReference<HandlerActivity> weakReference;        public MyHandler(HandlerActivity activity){            weakReference = new WeakReference<HandlerActivity>(activity);        }        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            //从弱引用中得到一个 activity ,当activity关闭时,则得到的是 null            HandlerActivity activity =  weakReference.get();            if(activity !=null){                //处理事物            }        }    }}


这个相当于是运用Handler的小例子(开始以为比较炫酷)

/*** * 闪屏页的作用:过一会转到其它页面 * 1. 提供欢迎界面 * <p/> * 2.初始化工作 *  *  *全屏主题 android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar.Fullscreen" */public class Splash extends Activity {    //定义内部类    private static class handler extends Handler {        WeakReference<Splash> weakReference;        public handler(Splash activity) {            weakReference = new WeakReference<Splash>(activity);        }        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            Splash splash = weakReference.get();            if (splash != null) {                //处理            }        }    }    ;    //实例化    handler h = new handler(this);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_splash);        //3 秒后启动一个 activity;        h.postDelayed(new Runnable() {            @Override            public void run() {                startMyactivity();            }        }, 3000);    }    //启动一个activity    private void startMyactivity() {        Intent intent = new Intent(this, MainActivity.class);        startActivity(intent);    }}

这里handler就说到这里,后期再加强

0 0
原创粉丝点击