移动开发——安卓开发面试必备的基础知识(二)

本篇文章继续对安卓开发面试必备的基础知识进行梳理。

     一、关于Handler

        
       handler 是一个消息分发对象,通过发送和处理Message和Runnable对象来关联对应线程的MessageQuene
       handler的作用:
       1,可以让对应的Message和Runnable在未来的某个时间点    进行相应处理
       2,让自己想要处理的耗时操作放在子线程,让更新UI的操作放在主线程
       handler的使用方法:
       1,post(runnable)    发送延时消息并处理
       2,sendMessage(message)    进行子线程和主线程之间的消息传递
       post用法:
            
public class MainActivity extends Activity {  
    private TextView textView;  
    private int i=0;  
    private boolean flag =false;  
    private Runnable runnable = new Runnable() {      
        @Override  
        public void run() {  
            i++;  
            textView.setText(i+"");  
            handler.postDelayed(runnable, 500);  
        }  
    };  
    private Handler handler = new Handler();  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        textView =(TextView) findViewById(R.id.textView);  
        handler.postDelayed(runnable, 500);  
    }  
      
    //button的点击事件的回调方法  
    public void remove(View view){  
        if(!flag){  
            flag =true;  
            handler.removeCallbacks(runnable);  
        }else{  
            flag =false;  
            handler.postDelayed(runnable, 500);  
        }  
    }  
}  

上述例子通过post(Runnable)的方法,传递一个runnable对象给主线程,runnable中的run方法是在UI现线程中执行的。并且通过button的回调可以控制循环的开始和停止

sendMessage用法:
public class MainActivity extends Activity {  
    private TextView textView;  
    private Handler handler = new Handler(){  
        public void handleMessage(android.os.Message msg) {  
            textView.setText("Hanlder");  
        };  
    };  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        textView =(TextView) findViewById(R.id.textView);  
        new Thread(){  
            public void run() {  
                try {  
                    Thread.sleep(1000);  
                    handler.sendEmptyMessage(1);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                  
            };  
        }.start();  
    }   
} 
子线程 sleep模拟耗时操作,通过handler发送空消息到UI线程,UI线程通过handler的handleMessage方法进行UI更新

     二、关于Handler机制

Handler:发送和处理消息,发送消息必须有Looper

Looper:通过loop方法读取MessageQueue中的消息并交给Handler处理

MessageQueue:消息队列,持有Message

Message:消息对象

 

     三、关于Handler内存泄漏

原因:静态内部类持有外部类的匿名引用,导致外部activity无法释放

解决方式:1,把handler改为静态内部类

                 2,在activity的onDestory生命周期方法中调用handler.removeCallback()

 

     四、关于AsyncTask

AsyncTask本质上是一个封装了线程池和handler的异步框架,主要用来执行异步任务,避免了直接使用线程类Thread和Handler直接处理后台操作,适合于耗时较短的操作,耗时较长的操作最好使用线程池

使用方法:3个参数,5个方法

AsyncTask<Integer,Integer,String>

第一个参数,在执行AsyncTask时所要传入的参数,后台任务所需

第二个参数,在执行AsyncTask时界面上显示进度

第三个参数,在执行AsyncTask结束时需要返回的参数

5个方法:

onPreExecute(),执行在耗时操作之前,常用于初始化操作,运行在主线程

doInBackground(),执行耗时操作,其中可以调用publishProgress()发布一个进度单位来显示后台进行的计算,如进度

onProgressUpdate(),通常在publishProgress()方法调用之后执行,动态显示数据,如进度条

onPostExecute(),后台计算完成之后调用
 
AsyncTask是一个静态线程池,其派生出的子类可以实现不同的异步任务
 

 

     五、关于handlerThread

本质是一个线程类,内部持有looper,可以进行looper循环,所以在类中可以创建Handler来发送和处理消息 ,内部为串行处理,性能消耗少,但多任务时效率低,因其只有一个线程,所以线程相对安全

 

     六、关于intentService

本质是一个封装了handlerThread和handler的异步框架,其中有一个工作线程来处理耗时操作,任务结束时,intentService会自动停止,并可以被启动多次,执行方式为串行
使用方法:实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值