• Android攻城狮 Handler与子线程


    Handler和线程是相关联的。
    
    再次强调:不可以在主线程中做耗时操作,就比如示例里面主线程中的 handlerMessage(),不能执行耗时操作。
    创建一个与自定义线程相关的Handler的代码: class MyThread extends Thread{ public Handler handler; @Override public void run() { Looper.prepare(); // 创建Looper,默认情况是根据当前线程去拿到Looper handler = new Handler(){ // 与子线程相关的Handler @Override public void handleMessage(Message msg) { System.out.printf("currentThread:"+Thread.currentThread()); // 打印当前线程的id } }; Looper.loop(); // 调用该方法实现对消息的循环处理 } } 要在线程中创建一个 Handler,需要先创建 Looper ,创建的方法很简单:Looper.prepare(); 之后就可以创建 Handler 了。在创建 Handler 之后别忘了调用 Looper.loop(); 这样才能实现对消息的循环处理。 摘自评论区: 推荐博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html





    主线程和子线程之间的交互的实现
    本例的思路:
    1. 在主线程中创建两个Handler对象 handler 和 handler2(图中是threadHandler),并直接初始化 handler,而handler2 不初始化。
    2. 使用 HandlerThread 创建一个子线程 thread ,并启动 thread 。
    3. 初始化 handler2(使用 thread 的 getLooper()作为参数),这样一来handler2就是子线程的 Handler 对象。
    4. 重写 handler 和 handler2 的 handleMessage()方法,在里面创建Message对象,并使用对方的sendMessageDelayed(message,1000);方法发送消息。
    5. 定义一个Button,定义点击事件,由点击事件触发如上交互的操作。
    
    如上操作中,第4点是核心,也就是两个 Handler 各自重写 handleMessage(),方法里面却是使用对方的 sendMessage() 方法。这样就实现了主线程和子线程的相互发送信息。
    --------------
    摘自评论区,亲测有效:
    取消发送,经测试,需要将UIhandler  和 threadhandler中的message的what 设置为1,取消的时候要同时removeMessage(1);
     1 public class FourActivity extends Activity implements OnClickListener {
     2     private Button button1, button2;
     3     // 创建主线程的 Handler
     4     private Handler handler = new Handler() {
     5         public void handleMessage(android.os.Message msg) {
     6             Message message = new Message();
     7             System.out.println("----main handler");
     8             // 向子线程发送消息
     9             threadHandler.sendMessageDelayed(message, 1000);
    10         };
    11     };
    12 
    13     private Handler threadHandler;
    14 
    15     @Override
    16     protected void onCreate(Bundle savedInstanceState) {
    17         // TODO Auto-generated method stub
    18         super.onCreate(savedInstanceState);
    19         setContentView(R.layout.four);
    20         button1 = (Button) findViewById(R.id.button1);
    21         button2 = (Button) findViewById(R.id.button2);
    22         button1.setOnClickListener(this);
    23         button2.setOnClickListener(this);
    24         HandlerThread thread = new HandlerThread("HandlerThread");
    25         thread.start();
    26         // 创建子线程的Handler
    27         threadHandler = new Handler(thread.getLooper()) {
    28             @Override
    29             public void handleMessage(Message msg) {
    30                 // TODO Auto-generated method stub
    31                 Message message = new Message();
    32                 System.out.println("----thread handler");
    33                 // 向主线程发送消息
    34                 handler.sendMessageDelayed(message, 1000);
    35             }
    36         };
    37     }
    38 
    39     @Override
    40     public void onClick(View v) {
    41         // TODO Auto-generated method stub
    42         switch (v.getId()) {
    43         case R.id.button1:
    44             handler.sendEmptyMessage(1);
    45 
    46             break;
    47         case R.id.button2:
    48             handler.removeMessages(1);
    49             break;
    50         }
    51     }
    52 }

     

  • 相关阅读:
    IDEA debug时特慢 Method breakpoints may dramatically slow down debugging
    docker构建镜像
    ubuntu 挂载硬盘
    python 的 flask 、django 、tornado 、sanic
    scrapy实战之scrapyrt的使用
    scrapy框架集成http
    python3之Splash
    CentOS7安装PostgreSQL9.6(图文详细操作)
    替代Navicat的数据库操作工具DBeaver
    CentOS 7 安装 Graylog
  • 原文地址:https://www.cnblogs.com/my334420/p/6758675.html
Copyright © 2020-2023  润新知