Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验
来源:互联网 发布:中企动力域名转出 编辑:程序博客网 时间:2024/04/29 19:04
在简易音乐播放器中,用了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数据结构。
下面来个例子吧还是,新建工程HandlerTest,编写简单布局如下:
<?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();就可以执行了,效果如上就不添图了。
- Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验
- Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验
- Android异步消息之Looper、Handler、Message、HandlerThread的关系
- Android异步消息处理之Looper,Handler,Message,MessageQueue
- Android异步消息处理机制之Handler、Looper、Message
- Android 异步消息处理机制之Handler、Message、Looper
- Android开发详解之异步处理Handler,Message,Looper详解
- Android开发之 Handler、Message、MessageQueue、Looper
- Android系统分析之异步消息处理机制-Message/Handler/MessageQueue/Looper
- Android 异步消息处理机制 Handler、Looper、Message、MessageQueue之藕断丝连
- Android消息机制之四---Looper,Handler,Message例子
- Android开发之漫漫长途 VII——Android消息机制(Looper Handler MessageQueue Message)
- Android消息机制之Looper和Handler
- Android消息机制之 Looper、Handler、Message的关系和运行
- Android异步消息处理线程之----Looper+MessageQueue+Handler
- Android-异步消息处理机制(Handler,Looper,Message)
- Android异步消息的处理机制(looper handler message)
- Android 异步消息处理机制:Looper、Handler、Message
- Notification bar icon turns white in Android 5 Lollipop
- oracle 数据库的建表以及字段的增删改查
- bzoj1925
- doT.js的基本使用
- javascript中的静态和非静态使用
- Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验
- PHP编程效率的20个要点
- window和Linux双系统,如何卸载其中之一
- Android编程编码规范
- navigationController
- 栈和队列(C语言版)
- ios学习--苹果中级证书失效以及开发证书失效的解决方案(2016年2月14日Failed to locate or generate matching signing assets)
- HTTP cookies 详解
- 使用new和反射产生java内部类的实例化对象