美文网首页
Android多线程使用详解

Android多线程使用详解

作者: kjy_112233 | 来源:发表于2017-08-10 11:53 被阅读0次

    一、Thread、HandlerThread

    • MyThread继承于Thread类,重载Thread类的run函数,run函数执行子线程任务。实例化MyThread并调用它的start函数,子线程创建完毕并且调用MyThread.run函数。当这个run函数执行完成后,子线程也就结束了,它没有消息循环的概念。
        private class MyThread extends Thread{
            @Override
            public void run() {
                super.run();
            }
        }
    
        private Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                
            }
        });
    
        //启动子线程
        MyThread myThread = new MyThread();
        myThread.start();
    
    • HandlerThread创建具有消息循环功能的子线程。
        private void initHandlerThread() {
            //创建HandlerThread实例
            HandlerThread handlerThread = new HandlerThread("handler_thread");
            //开始运行线程
            handlerThread.start();
            //获取HandlerThread线程中的Looper实例
            Looper loop = handlerThread.getLooper();
            //创建Handler与该线程绑定。
            Handler handler = new Handler(loop) {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    //执行子线程任务
                }
            };
        }
    

    二、AsyncTask

        private class MyAsyncTask extends AsyncTask{
            //执行线程任务前的操作
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
    
            //接收输入参数
            //在方法中执行任务中的耗时操作
            //返回线程任务执行的结果
            @Override
            protected Object doInBackground(Object[] objects) {
                return null;
            }
    
            //在主线程显示线程任务执行的进度
            @Override
            protected void onProgressUpdate(Object[] values) {
                super.onProgressUpdate(values);
            }
    
            //接收线程任务执行结果
            //将执行结果显示到UI组件
            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
            }
    
            //取消异步任务
            @Override
            protected void onCancelled() {
                super.onCancelled();
            }
        }
    
        MyAsyncTask myAsyncTask = new MyAsyncTask();
        myAsyncTask.execute();
        myAsyncTask.cancel(true);
    

    优点:

    • 方便实现异步通信:不需使用 “任务线程(如继承Thread类) + Handler”的复杂组合
    • 节省资源:采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销
      缺点:
    • 多个异步操作需要更新UI时,就变得麻烦起来。

    三、Activity.runOnUiThread

        private Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //更新UI操作
                    }
                });
            }
        });
    

    Activity.runOnUiThread源码

        public final void runOnUiThread(Runnable action) {
            if (Thread.currentThread() != mUiThread) {
                mHandler.post(action);
            } else {
                action.run();
            }
        }
    

    相关文章

      网友评论

          本文标题:Android多线程使用详解

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