Android线程

在Android程序开始运行的时候会单独启动一个进程,默认情况下所有这个程序操作都在这个进程中进行。一个Android程序默认情况下只有一个进程,但是一个进程却是可以有许线程的。

在这些线程中,有一个线程叫做UI线程,也叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。Main Thread主要负责控制UI页面的显示、更新、交互等。因此所有在UI线程中的操作要求越短越好,只有这样用户才会觉得操作比较流畅。一个比较好的做法是把一些比较耗时的操作,例如网络请求、数据库操作、复杂计算等逻辑都封装到单独的线程,这样就可以避免阻塞主线程。

所以,一个Android程序,一个进程一个UI线程,多个子线程UI线程负责UI,子线程负责耗时的网络操作

实现线程的方法:

1.扩展Thread类

        //内部类的方式实现
        new Thread(){
            public void run() {
                System.out.println("Thread02");
            };
        }.start();

2.实现Runnable接口

        //内部类的方式实现
        Runnable run = new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("run01");
            }
        };
        
        Thread b = new Thread(run);
        b.start();

3.使用异步类AsnyncTask

/**
 * Params 启动任务执行的输入参数,比如HTTP请求的URL。
 * Progress 后台任务执行的百分比。 
 * Result 后台执行任务最终返回的结果,比如String,Integer等。
 * @author Administrator
 */
class FriendsAsyncTask extends AsyncTask {

    /*
     * 为了正确的使用AsyncTask类,以下是几条必须遵守的准则: 
     * 1)Task的实例必须在UI线程中创建    
     * 2)execute方法必须在UI线程中调用    
     * 3)不要手动的调用onPreExecute(),
     * onPostExecute(Result),doInBackground(Params...),
     * onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。  
     * 4)该task只能被执行一次,否则多次调用时将会出现异常
     *
     */

    /**
     * 该方法将在执行实际的后台操作前被UI线程调用。 可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化
     */
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

    /**
     * 这里的String参数对应AsyncTask中的第一个参数 这里的String返回值对应AsyncTask的第三个参数
     * 该方法并不运行在UI线程当中,主要用于异步操作,所以在该方法中不能对UI当中的控件进行设置和修改
     * 该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。
     */
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        return null;
    }

    // 在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }

    // 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI
    // 线程,并且在界面上展示给用户.
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }

    // 在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
    @Override
    protected void onCancelled() {
        // TODO Auto-generated method stub
        super.onCancelled();
    }
}

FriendsAsyncTask task = new FriendsAsyncTask();
task. execute(params);//这里的params对应doInBackground中的params

子线程和UI线程通信

Handler 机制

    new Thread() {
        public void run() {
            Message msg = new Message();
            Object result = "flag01";//网络耗时操作
            msg.obj = result;
            msg.what = thread01;
            information.sendMessage(msg);
        };
    }.start();

    //*********************

    private final int thread01 = 1;
    private final int thread02 = 2;

    //*********************

    private Handler information = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case thread01:
                System.out.println("thread01"+msg.obj);
                break;
            case thread02:
                System.out.println("thread02"+msg.obj);
                break;
            default:
                break;
            }
        }
    };

参考

http://blog.csdn.net/boyupeng/article/details/6208072
http://www.open-open.com/lib/view/open1434802647364.html
http://blog.csdn.net/boyupeng/article/details/49001215
http://blog.csdn.net/harvic880925/article/details/24774883

你可能感兴趣的:(Android线程)