Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验

胸怀万里世界, 放眼无限未来。这篇文章主要讲述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 ThreadmThread; 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的内容,执行例如以下:
Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验            Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验

文章图片

    主要的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 ThreadmThread; 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(); changeViewContentTasktask = 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之初体验】






    推荐阅读