扣丁学堂——handler

一丶代码见本文

二丶课程讲解

扣丁学堂——handler_第1张图片

扣丁学堂——handler_第2张图片

扣丁学堂——handler_第3张图片

扣丁学堂——handler_第4张图片

扣丁学堂——handler_第5张图片


这里一个小例子帮助理解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就说到这里,后期再加强

你可能感兴趣的:(android,handler)