美文网首页
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