zoukankan      html  css  js  c++  java
  • Android线程之异步消息处理机制(一)

      Android不允许在子线程中进行UI操作,但是有些时候,我们必须在子线程里去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件。对于这种情况,Android提供了一套异步消息处理机制,完美地解决了在子线程中进行UI操作的问题。

    主线程:

    1、新建Handler对象

    2、重写父类handleMessage方法,在这里进行UI操作,此方法的代码在主线程中。

    子线程:

    1、创建Message对象

    2、指定Message的what字段

    3、调用handler的sendMessage方法,把message发送出去

    举例如下:

    MainActivity.java:

     1     package com.junhao.updateui;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.Message;
     7 import android.view.View;
     8 import android.view.View.OnClickListener;
     9 import android.widget.Button;
    10 import android.widget.TextView;
    11 
    12 public class MainActivity extends Activity implements OnClickListener {
    13     
    14     public static final int UPDATE_TEXT = 1;
    15     private TextView text;
    16     private Button changeText;
    17     
    18     private Handler handler = new Handler (){//新建Handler对象
    19         public void handleMessage(Message msg){//重写父类handleMessage方法,在这里进行UI操作,此方法的代码在主线程中。
    20             switch (msg.what){
    21             case UPDATE_TEXT:
    22                 text.setText("再见");
    23                 break;
    24             default:
    25                 break;
    26             }
    27         }
    28     };
    29 
    30     @Override
    31     protected void onCreate(Bundle savedInstanceState) {
    32         super.onCreate(savedInstanceState);
    33         setContentView(R.layout.activity_main);
    34         
    35         text = (TextView)findViewById(R.id.textview);
    36         changeText = (Button)findViewById(R.id.changetext);
    37         changeText.setOnClickListener(this);
    38     }
    39     
    40     public void onClick(View v){
    41         switch (v.getId()){
    42         case R.id.changetext:
    43             new Thread(new Runnable(){//创建子线程
    44                 public void run() {
    45                     Message message = new Message();//创建Message对象
    46                     message.what = UPDATE_TEXT;//指定Message的what字段
    47                     handler.sendMessage(message);//调用handler的sendMessage方法,把message发送出去
    48                 }
    49             }).start();
    50             break;
    51         default:
    52             break;
    53         }
    54     }
    55 }

    activity_main.xml:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     tools:context="${relativePackage}.${activityClass}" >
     6 
     7     <TextView
     8         android:id="@+id/textview"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:text="@string/text" 
    12         android:layout_centerInParent="true"/>
    13     
    14     <Button 
    15         android:id="@+id/changetext"
    16         android:layout_width="match_parent"
    17         android:layout_height="wrap_content"
    18         android:text="@string/btn"/>
    19 
    20 </RelativeLayout>

    strings.xml:

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <resources>
    3 
    4     <string name="app_name">updateUI</string>
    5     <string name="text">你好</string>
    6     <string name="btn">更新UI</string>
    7 
    8 </resources>
    我的GitHub:https://github.com/lelelongwang
  • 相关阅读:
    spark记录(19)SparkStreaming之从kafkaBroker和zookeeper获取offset,和使用zookeeper管理offset
    spark记录(18)SparkStreaming+kafka receiver和directed模式
    spark记录(17)SparkStreaming checkpoint那些事儿
    spark记录(16)SparkStreaming On HDFS AND TO MySQL
    第三章:使用MYSQL
    第一章:了解SQL
    第零章:安装mysql和导入练习数据
    DjangoRestFramework整体结构---DjangoRestFramework处理一个接口请求的完整流程
    DjangoRestFrameWork整合sentry错误日志服务器
    ubuntu18.04安装错误日志服务器sentry
  • 原文地址:https://www.cnblogs.com/longjunhao/p/4234136.html
Copyright © 2011-2022 走看看