zoukankan      html  css  js  c++  java
  • Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验

        在简易音乐播放器中。用了Handler。也没有过多地去研究学习,这里再学习下android下的异步消息处理机制。

    这里用了Handler主要是在线程中不能更新UI,而须要通过Handler才干够。关于异步消息处理有几个概念。

        1、Message:消息,线程间通讯的数据单元。

    比如后台要下载歌曲然后下载完毕要更新ui,则能够发送一条包括更新信息的Message给UI线程。

        2、MessageQueue:消息队列。用来存放全部通过Handler公布的消息,由于是队列。所以是先进先出的。

        3、Handler:Message的主要处理者。负责将Message加入到消息队列以及对消息队列中的Message进行处理。

        4、Looper:循环管理MessageQueue。循环取出MessageQueue中的Message。并交给对应的Handler进行处理。

        5、线程:UI thread是main thread,android启动程序时会替他建立一个MessageQueue。

    每个线程里可含有一个Looper对象以及一个MessageQueue数据结构。

         以下来个样例吧还是,新建projectHandlerTest。编写简单布局例如以下:

    <?

    xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="10dp" tools:context="com.example.jared.handlertest.MainActivity"> <EditText android:id="@+id/inputContent" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入要改变的内容"/> <Button android:id="@+id/changeViewContent" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Change The ViewContent" android:textAllCaps="false"/> <TextView android:id="@+id/testHandler" android:text="I am old!!!" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:textSize="22dip" android:layout_gravity="center"/> </LinearLayout>


        这里输入内容。按button,改变TextView的内容。编写MainActivity代码例如以下:

    package com.example.jared.handlertest;
    
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        public static final int UPDATA_VIEW = 1;
    
        private TextView textView;
        private Button changeContent;
        private EditText inputContent;
    
        private Thread  mThread;
    
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case UPDATA_VIEW:
                        String mInputContent = inputContent.getText().toString();
                        textView.setText(mInputContent);
                        break;
                    default:
                        break;
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            textView = (TextView)findViewById(R.id.testHandler);
            inputContent = (EditText)findViewById(R.id.inputContent);
    
            changeContent = (Button)findViewById(R.id.changeViewContent);
            changeContent.setOnClickListener(new myOnClickListener());
        }
    
        private class myOnClickListener implements View.OnClickListener {
            @Override
            public void onClick(View view) {
                switch (view.getId()) {
                    case R.id.changeViewContent:
                        mThread = new Thread(runnable);
                        mThread.start();
                        break;
                    default:
                        break;
                }
            }
        }
    
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = UPDATA_VIEW;
                mHandler.sendMessage(message);
            }
        };
    }
    

        这里先new了一个Handler,handleMessage方法处理发送的Message。Thread里面发送message,然后更新TextView的内容,执行例如以下:

               

        主要的Handler已经完毕了,以下再学习下AsyncTask。

        AsyncTask是方便编写后台线程和UI线程的辅助类。

    它内部的实现是一个线程池。每一个后台会提交到线程池中去运行。AsyncTask有三个模板函数:

        1、Params:传递给后台任务的參数类型。

        2、Progress:后台计算运行过程中,进步的单位类型。

        3、Result:后台运行返回的结果的类型。

        当标示不须要的类型的时候,仅仅要用Void即可了。

        AsyncTask须要重写5个方法。各自是:

        1、onPreExecute方法:准备执行。该回调函数在任务被执行之后马上由UI线程调用。一般能够显示运行进度条。

        2、doInBackground(Params ...)方法:正在后台执行。通常在这里执行耗时的后台计算,计算结果返回给函数,这里假设AsyncTask的第三个參数是Void的话不须要返回,这里不能更新UI。可是能够调用publishProgress(Progress ...)方法完毕。

        3、onProgressUpdate(Progress ...)方法:进度更新,UI线程在publishProgress(Progress ...)方法调用完毕后被调用。一般动态显示一个进度。

        4、onPostExecute(Result)方法:完毕后台任务,会返回,这里能够进行些UI的操作,比方提醒任务运行的结果。以及关闭掉进度条对话框等。

        5、onCancelled方法:取消任务,在调用AsyncTask的cancel()方法的时候调用。

        以下通过AsyncTask的方式来进行上面的样例。Handler的代码就没有删除掉了,代码例如以下:

    package com.example.jared.handlertest;
    
    import android.os.AsyncTask;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        public static final int UPDATA_VIEW = 1;
    
        private TextView textView;
        private Button changeContent;
        private EditText inputContent;
    
        private Thread  mThread;
    
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case UPDATA_VIEW:
                        String mInputContent = inputContent.getText().toString();
                        textView.setText(mInputContent);
                        break;
                    default:
                        break;
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            textView = (TextView)findViewById(R.id.testHandler);
            inputContent = (EditText)findViewById(R.id.inputContent);
    
            changeContent = (Button)findViewById(R.id.changeViewContent);
            changeContent.setOnClickListener(new myOnClickListener());
        }
    
        private class myOnClickListener implements View.OnClickListener {
            @Override
            public void onClick(View view) {
                switch (view.getId()) {
                    case R.id.changeViewContent:
                       // mThread = new Thread(runnable);
                       // mThread.start();
                        changeViewContentTask  task = new changeViewContentTask();
                        task.execute();
                        break;
                    default:
                        break;
                }
            }
        }
    
        class changeViewContentTask extends AsyncTask<Void, Integer, Boolean> {
            @Override
            protected Boolean doInBackground(Void... voids) {
                return null;
            }
    
            @Override
            protected void onProgressUpdate(Integer... values) {
            }
    
            @Override
            protected void onPostExecute(Boolean b) {
                String mInputContent = inputContent.getText().toString();
                textView.setText(mInputContent);
            }
    
            @Override
            protected void onPreExecute() {
            }
    
            @Override
            protected void onCancelled() {
            }
        }
    
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = UPDATA_VIEW;
                mHandler.sendMessage(message);
            }
        };
    }
    
        这里实例化一个task。然后task.execute();就能够运行了,效果如上就不添图了。

  • 相关阅读:
    k8s前期部署准备
    树莓派安装Gitlab-runner
    GitLab CI/CD 报错
    测试
    LVS结合keepalive
    LVS实现负载均衡安装配置详解
    LVS实现负载均衡原理
    私有仓库 gitlab 部署笔记
    Docker 案例: 在容器中部署静态网站
    docker 容器的启动方式
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7224647.html
Copyright © 2011-2022 走看看