美文网首页
Android线程

Android线程

作者: 一只在时光里流浪的大懒猫 | 来源:发表于2017-02-01 11:35 被阅读0次

    在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<String, Integer, String> {
    
        /*
         * 为了正确的使用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线程

          本文链接:https://www.haomeiwen.com/subject/dqzkittx.html