扣丁学堂——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
- 扣丁学堂——handler
- 扣丁学堂笔记第14天Handler与多线程
- 扣丁学堂——ListView
- 扣丁学堂——自定义组件
- 扣丁学堂——ViewPager+ImageSwitch
- 扣丁学堂——SharedPreferences
- 扣丁学堂——Intent
- 扣丁学堂——Service
- 扣丁学堂——收发短信
- 扣丁学堂——AlarmManager
- 扣丁学堂——Fragments
- 扣丁学堂——ActionBar
- 扣丁学堂——TelephoneManager
- 扣丁学堂——AsyncTask
- 扣丁学堂——文件管理
- 扣丁学堂——XML解析
- 扣丁学堂——Json解析
- 扣丁学堂——SQLite
- Android基本知识
- HVR简单聊
- cmd>file 2>&1与cmd 2>&1 >file
- ios设计模式2-工厂模式
- 接口相关的设计模式
- 扣丁学堂——handler
- Sharedperferences数据储存
- visualgdb下stm32工程模板修改
- 面向对象设计原则---里氏代换原则
- iOS:iOS9关于HTTP和HTTPS的问题
- 使用Java调用控制台实现任意视频文件转换Gif图片
- 全面解析Linux 内核 3.10.x - Pid hash 链表
- 词法分析的各类用途2
- 一个积分问题