• 有主线程发送message给子线程


      通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程。比如下面示例:

     1 package com.example.testlistener;
     2 
     3 import java.util.Timer;
     4 import java.util.TimerTask;
     5 
     6 import android.app.Activity;
     7 import android.content.res.Configuration;
     8 import android.os.Bundle;
     9 import android.os.Handler;
    10 import android.os.Message;
    11 import android.view.View;
    12 import android.view.View.OnClickListener;
    13 import android.view.View.OnLongClickListener;
    14 import android.widget.Button;
    15 import android.widget.EditText;
    16 import android.widget.Toast;
    17 
    18 public class MainActivity extends Activity {
    19     EditText txt;
    20     final Handler hander = new Handler(){
    21         public void handleMessage(android.os.Message msg) {
    22             if(msg.what == 0x1234){
    23                 Toast.makeText(MainActivity.this, msg.arg1 + "", 1000).show();
    24             }
    25         };
    26     };
    27     @Override
    28     protected void onCreate(Bundle savedInstanceState) {
    29         super.onCreate(savedInstanceState);
    30         setContentView(R.layout.activity_main);
    31         
    32         new Timer().schedule(new TimerTask() {
    33             int i = 0;
    34             @Override
    35             public void run() {
    36                 i++;
    37                 Message msg = new Message();
    38                 msg.what = 0x1234;
    39                 msg.arg1 = i;
    40                 hander.sendMessage(msg);
    41             }
    42         }, 0, 2000);
    43     }
    44     
    45 }

      那么,我们能不能通过Handler从主线程发送消息给子线程呢?答案是肯定的,需要用到Looper.prepare()和Looper.loop()。如下面的代码:

     1 public class MainActivity extends Activity {
     2     EditText txt;
     3     Button bt;
     4     TestThread testThread;
     5     int j = 0;
     6     
     7     @Override
     8     protected void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10         setContentView(R.layout.activity_main);
    11         txt = (EditText) findViewById(R.id.txt);
    12         bt = (Button) findViewById(R.id.bn);
    13         testThread = new TestThread();
    14         testThread.start();
    15         bt.setOnClickListener(new OnClickListener() {
    16             
    17             @Override
    18             public void onClick(View arg0) {
    19                 j++;
    20                 Message msg = new Message();
    21                 msg.what = 0x1000;
    22                 msg.arg1 = j;
    23                 testThread.thander.sendMessage(msg);
    24             }
    25         });
    26         
    27         
    28     }
    29     
    30     //自定义子线程
    31     class TestThread extends Thread{
    32         public Handler thander;
    33         @Override
    34         public void run() {
    35             //创建一个Looper对象
    36             Looper.prepare();
    37             thander = new Handler(){
    38                 @Override
    39                 public void handleMessage(Message msg) {
    40                     if(msg.what == 0x1000){
    41                         System.out.println("j = " + msg.arg1);
    42                         //txt.setText(msg.arg1 + "");
    43                     }
    44                 }
    45             };
    46             //启动Looper
    47             Looper.loop();
    48         }
    49     }
    50     
    51 }
  • 相关阅读:
    逆向测试设计
    JNLP
    3. 技术专题
    8.2. Angular使用Material控件库
    Spring Boot Actuator
    安装
    apk文件结构及反编译/代码混淆
    Visual Studio中attach进程进行调试
    .NET反编译
    3. 技术专题
  • 原文地址:https://www.cnblogs.com/l2rf/p/6062104.html
Copyright © 2020-2023  润新知