Android UI主线程与子线程

  一个Android 程序默认状况只有一个进程,可是一个进程能够有多个线程。其中有一个UI 线程也称为UI主线程,UI Thread在Android程序运行的时候就被建立,主要是负责控制UI界面的显示、更新和控件交互。全部的Android应用程序组件----包括Activity、Service、Broadcast Receiver都在应用程序的主线程中运行。所以,任何组件中的费时操做处理均可能阻塞全部其余的组件、包括Service和可见的Activity。数据库

  在Android 中,对未响应的定义是:Activity对一个输入事件在5s内没有响应,或者Broadcast Receiver在10s内没有完成他的onReceive处理程序。对于任何不用直接和用户界面进行交互的重要处理,使用后台线程技术处理是很是重要的,将文件操做、网络交互、数据库、复杂计算调度到后台线程中完成很是重要,以避免阻塞主线程。网络

方法一:Thread+Handler异步

开启一个新线程:new Thread(new MyThread()).start();ide

//经过Handler物件,通知主线程UI Thread来更新界面
    Handler myHandler=new Handler(){
        //此方法主要用于更新UI
        public void handleMessage(Message msg){
            switch(msg.what){
                //根据Thread返回的标识进行相应的处理
            }
        }
    };
    
    class MyThread implements Runnable{
        public void run(){
            int what=0;
            //将耗时操做放到这里处理
            
            //to-do
            
            //将标识发给Handler
            myHandler.obtainMessage(what).sendToTarget();
        }
    }

方法二:使用AsyncTask运行异步线程。spa

  AsyncTask为将耗时操做移到后台线程并在操做完成后同步更新UI线程实现了最佳实践模式。他有助于将事件处理程序与GUI线程进行同步,容许经过更新视图和其余UI元素来报告进度或者在任务完成后发布结果。线程

  要建立一个新的异步任务,须要扩展AsyncTask类,指定要使用的参数类型:code

public class MyAsyncTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object... arg0) {
        // TODO Auto-generated method stub
        
        //将耗时操做放到此方法中来处理
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        
        //更新UI,起到了handler的做用
    }
    
}

运行异步任务:blog

new MyAsyncTask().execute();

进程