Android_知识点总结(不断更新中...)

Hanler相关

 

1.Android的多线程如何实现?

多线程实现方式implements Runnable或 extends Thread

2.Android的异步任务有什么方法实现?

Activity.runOnUIThread(Runnable)

View.post(Runnable)、View.postDelay(Runable,long)

Handler

AsyncTask

AsyncTaskLoader(3.0以后提供)

3.Android如何确保UI的线程安全?

任何UI的操作都放到UI线程中,否则出现ANR错误

4.多个Handler使用同一个HandlerThread

a.同一个HandlerThread可以有多个Handler吗?

答:同一个HandlerThread可以有多个Handler

b.同一个HandlerThread中使用多个HandlerMessage会混淆吗?

答:同一个HandlerThread中使用多个HandlerMessage不会混淆,每一个Message都有一个Target,该属性指向绑定的Handler

5.Handler是否可以创建到任意线程中呢?

Handler不可以直接创建到任意的线程中去的,它应该在一个有LooperThread中创建,而且要在Looper准备好了之后(Looper.prepare()Looper.loop();)

6.如何指定Looper(Handler)运行的线程?

a. 调用Looper.getMainLooper()获取UI线程的Looper

new Thread(newRunnable(){

  @override

       public void run() {

                Handler mHandler = new Handler(Loooer.getMainLooper()){

                     @override

                       publicvoid handleMessage(Message msg){

                            super.handleMessage(msg);

                                   //业务逻辑

                          }

                };

              mHandler.sendMessage();

       }

}).start;

b.创建Handler时调用HandlerThread.getLooper()获取指定线程的Looper

     HandlerThread _HandlerThread = newHandlerThread("fang");

     _HandlerThread.start();

     Handler mHandler = new Handler(_HandlerThread.getLooper());

     mHandler.sendEmptyMessage(1);

c.调用Handler(Looper)以确定其使用的Looper

     new Thread(newRunnable(){

            @override

             public void run() {

                      Looper.prepare();

                      Handler mHandler = new Handler(){

                       @override

                     publicvoid handleMessage(Message msg){

                            super.handleMessage(msg);

                                   //业务逻辑

                             }

                      };

          mHandler.sendMessage();

          Looper.loop();

     }

}).start;

7.同一个Handler中不同的消息会同时执行吗?

a.定义两条有耗时操作的Message,并同时发送这两条消息

b.再定义一个Runnable,尝试同时执行MessageRunnable

答:当Handler发送两条Message后,该Message就会被放到MessageQueue上,只有当第一条Message执行完后,第二条Message才会被执行,即线性执行

同理:

Handler发送一个Message和一个Runnable后,线性执行

Handler发送两条Runnable后,线性执行

总结:

MessageRunnable共用同一个MessageQueue

8.对于正在执行的Message,调用removeMessage会有什么后果?

a.调用removeMessage移除一个还没有开始执行的message,有什么效果

b.移除一个正在执行的message,有什么效果

答:调用removeMessage移除一个还没有开始执行的message时,该MessageQueue中的Message就不会被执行了。

移除一个正在执行的message时,removeMessage无效,Message还要被执行完。

总结4-8点:

a.Handler实例与消息处理是关联的,发送和接收要匹配

b.可以通过设置Looper来选择器已给的线程

c. MessageQueue中的Message都是线性执行的(只有上一个Message执行完,才执行下一个Message)

d. removeMessage只能移除队列中未被处理的Message,一旦这个Message被处理进行时,此操作无效

9.Handler的post和sendMessage方法,使用的是一个队列还是两个?

HandlerpostsendMessage方法,使用的是同一个队列,sendMessagehandlerMessage函数处理,post由回调函数(Runnable函数)处理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Android_知识点总结(不断更新中...))