• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验

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

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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数据结构。

下面来个例子吧还是,新建工程HandlerTest,编写简单布局如下:

 

<!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E-->
<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">


</textview></button></edittext></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 {
        @Override
        protected B



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-26Android Studio的SVN Performing VCS Refresh/Commit 长时间不结束,androidsvn
  • 2017-05-26SwipeRefreshLayout下拉刷新,swiperefreshlayout
  • 2017-05-26android开发零基础入门教程,android入门教程
  • 2017-05-26弧形菜单(Android),弧形菜单android
  • 2017-05-26Android开发学习——ListView+BaseAdapter的使用,androidbaseadapter
  • 2017-05-26我的Android进阶之旅------Android 5.0中出现警告的解决方法: Service Intent must be explicit:
  • 2017-05-26国外干货!6个方法助你设计出优秀的APP,干货app
  • 2017-05-26Android开源库集合(工具),android开源库集合
  • 2017-05-26Android编程思想双11口诀,android编程思想
  • 2017-05-26如何为APK签名?,APK签名?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • iOS,Android网络抓包教程之tcpdump
    • Android使用静默安装时碰见的问题,android静默
    • 【Android】第7章(2)--布局控件常用的公共属性,android第7章
    • Android实现一个自定义相机的界面
    • 手机游戏渠道SDK接入工具项目分享(二)万事开头难,手机游戏sdk
    • 网站访问量和服务器带宽的选择
    • android浏览器 源码共享,android浏览器源码
    • 使用ContentProvider访问非数据库数据
    • Android studio 插件之 GsonFormat (自动生成javabean)
    • Mac OSX系统搭建React natvie for android 开发环境,osxnatvie

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有