Android相关知识

一、Android 主线程与子线程通信方式有五种,第三、四种,工作线程中只能操作调用它的View
  1、handler
  2、Activity.runOnUIThread(Runnable)
  3、View.Post(Runnable)
  4、View.PostDelayed(Runnabe,long)
  5、AsyncTask

二、Android应用程序有两类线程:主线程和工作线程。Android开发中一般主线程不做耗时的操作,子线程不更新UI。子线程可以使用Handler来实现UI更新。Android提供了Handler类和Looper类来访问消息队列。 Android 中线程间通信就得用到 android.os.Handler 类了。 每一个 Handler 都与一个线程相关联。 而 Handler 的主要功能之一便是: 在另一个线程上安插一个需要执行的任务。

三、android多线程创建的方式:一种是继承Thread类,一种是实现Runable接口。Runnable可实现资源共享。能用Runnable接口一般都不直接用Thread类。

  1. 继承Thread类:创建一个类如MyThread,该类extends Thread,该类里面重写run( )方法。调用该类时MyThread mt1 = new MyThread(),然后mt1.start()即可启动该线程,注意不是调用run( )方法。想要多少线程就new多少MyThread()。
  2. 实现Runnable接口:创建一个类如MyRunnable,该类implements Runnable,该类里重写run()方法。调用该类时MyRunnable mr1 = new MyRunnable(),然后Thread t1 = new Thread(mr1),然后t1.start()即可启动该线程。想要多少线程就new多少MyRunnable。多个Thread对象操作一个mr1要加锁,即run()里写synchronized(this){同时刻仅单个线程能够进行的操作}。

四、AsyncTask是封装好的线程池,比起Thread+Handler的方式,AsyncTask在操作UI线程上更方便,因为onPreExecute()、onPostExecute()及更新UI方法onProgressUpdate()均运行在主线程中,这样就不用Handler发消息处理了;

五、AsyncTask的全局线程池只有5个工作线程,也就是说,一个APP如果运用AsyncTask技术来执行线程,那么同一时间最多只能有5个线程同时运行,其他线程将被阻塞(注:不运用AsyncTask执行的线程,也就是自己new出来的线程不受此限制),所以AsyncTask不要用于多线程取网络数据,因为很可能这样会产生阻塞,从而降低效率。AsyncTask用的是线程池机制,容量是128,最多同时运行5个core线程,剩下的排队。

六、Handler使用

 

  • Handler:相当于消息队列中具体处理消息的工人。可以有多个
  • Looper:相当于消息队列中的管家。只有1个。
  • MessageQueen:存放消息的队列。
  • Message:传递信息的消息体

  1.主线程是 有且仅有一个Looper对象, Looper对象里又有一个MessageQueue。
  2. Looper 负责不停的loop,并调用Handler的handleMessage处理Message。
  3. Handler 负责投递message, 以及提供处理消息的方法handleMessage。
  4 任何非主线程, 想要给 主线程发message, 必须通过handler(该handler内部包含了主线程的Looper引用)

七、回调函数:
1.回调函数就是那些自己写的,但是不是自己来调,而是给别人来掉的函数。回调函数赋予程序员这样一种能力,让自己编写的代码能够跳出正常的程序控制流,适应具体的运行环境在正确的时间执行。
2.所谓回调,就是对象A调用另一对象B中的某个方法b,然后B又在某个时候反过来调用A中的某个函数c,对于B来说,这个c便叫做回调函数。回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口.
3.可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

原文地址:https://www.cnblogs.com/kerwincui/p/15366078.html