Android线程及进程笔记
来源:互联网 发布:炒股神经病 知乎 编辑:程序博客网 时间:2024/06/05 16:45
1. UI线程需要在主线程中进行操作,否则会影响线程安全
2.若在Adapter中的getView方法进行耗时操作,会影响listView滑动效果
3.Handler:线程中实现切换机制的线程类
Looper:每个线程均有的消息循环
Looper.getMainLooper(); 主线程中的循环 Looper.myLooper();当前线程的循环 若两个一致,则当前线程为主线程不是后台线程。
activity.this.runOnUiThread(new Runnable(){}); 强制切换到主线程中
在内部类里面的handler对象需要采用final形式
public void onClick(View v){final Handler handler = new Handler();final Runnable handlerTask = new Runnable(){public void run(){}};Runnable task = new Runnable(){public void run(){handler.post(handlerTask);}};final Thread t= new Thread(task);t.start();}在handleMessage中,通过msg.what判断message 的类。 sendMessage和handleMessage的用法。
public void onButtonClick(View v){final Handler handler = new Handler(){public void handleMessage(Message msg){String tost="None";switch(msg.what){case 0:tost="--"+msg.obj;break;}MainActivity.this.makeToast(toast);}};Thread t = new Thread(new Runnable()){public void run(){Message msg0= Message.obtain(handler,0,"参数0");handler.sendMessage(msg0);}});t.start();}handler线程切换:public final boolean post(Runnable r)
a,在UI线程中创建handler b,手动创建looper
handlerThread 是thread子类,自动创建Looper
取消消息: public final void removeCallbacks(Runnable r )
Looper的退出: handlerThread.quit();
消息队列中全部的等待消息均退出,包括原先在消息队列但是未被处理的消息
handlerThread.quitSafely();若当前消息结束,后续等待着的消息可以立刻执行,并不会移除到消息队列外
public void onButtonClick(View v){final handlerThread outerThread = new handlerThread("HandlerThread");outerThread.start();final Handler handler = new Handler(outerThread.getLopper());Thread t = new Thread (new Runnable(){public void run(){handler.postDelayed(new Runnable(){public void run(){SecondActivity.this.makeToast("postDelayed 消息")}},1000);handler.post(new Runnable(){public void run(){outerThread.quit();String msg="HandlerThread Loop 退出"SecondActivity.this.makeToast}});}});t.start();}
主线程默认存在Looper,后台线程Looper可能未被创建。MessageQueue属于主线程的Looper
public class FirstActivity extends AppCompatActivity{//当handler不为静态的或者是弱引用会造成内存泄漏private Handler mHandler = new Handler(){public void handleMessage(Message msg){//普通内部类对外部类进行引用获取到activityToast.makeText(FirstActivity.this,"消息来啦",Toast.LENGTH_SHORT).show();}};protected void onCreat(Bundle saveInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_first);Message msg= Message.obtain(mHandler,1);mHandler.sendMessageAtTime(msg,SystemClock.uptimeMillis()+60000);}}
MessageQueue-> msg -> mHandler ->FirstActivity 这个activity无法被GC
自定义Handler
public class FirstActivity extends AppCompatActivity{//静态内部类不存在对外部类的引用private int mMessageWhat;private Handler mHandler = new MyHandler(this);private static class MyHandler extends Handler{private weakReference<FirstActivity> mActivityRef;public MyHandler(FirstActivity activity){mActivityRef=new WeakReference<FirstActivity>(activity);}public void handleMessage(Message msg){if(mActivityRef.get()!=null){Toast.makeText(mActivityRef.get(),"消息来啦",Toast.LENGTH_SHORT).show();}}}protected void onCreat(Bundle saveInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_first);mMessageWhat=1;Message msg= Message.obtain(mHandler,mMessageWhat);mHandler.sendMessageAtTime(msg,SystemClock.uptimeMillis()+60000);}protected void onDestory(){super.onDestory();mHandler.removeMessages(mMessageWhat);}}
0 0
- Android线程及进程笔记
- android进程和线程--笔记
- android 进程与线程 笔记
- Python自学笔记八、进程及线程
- Android 进程与线程基础知识 及 如何停止进程
- 学习笔记--进程与线程的区别及联系
- 线程、进程及线程通信
- 进程及线程(2)
- 进程线程及堆栈
- Android学习笔记之----浅析Android进程与线程
- 【Android学习笔记】Android中的进程和线程
- 【线程和进程】Android线程和进程完全解析,及区别
- 进程与线程笔记
- 进程线程复习笔记
- 进程 线程笔记
- 进程线程笔记
- android如何打印当前的线程及进程
- Android中进程与线程及如何在子线程中操作UI线程
- 博文要有的元素
- iOS 开发之 pdf 文档的加载与浏览的 4 种方式
- extjs4.2导出excel表格
- Java Expression Language (JEXL)
- redis 数据类型详解 以及 redis适用场景场合
- Android线程及进程笔记
- chrome打不开plugins
- 各大互联网公司前端笔试面试题–HTML,CSS篇
- 用PHP实现一个关于德州扑克算法的程序(四):代码
- Android提示BOM错误排查
- Ubuntu shadowsocks https_proxy
- 文章标题
- 全局设置、自定义BuildConfig
- DOM事件流与事件委托