zoukankan      html  css  js  c++  java
  • Androidの多线程之Handler创建新线程

    两个Handler,一个是主线程的mainHandler,一个是获取HandlerThread的looper的Handler.

    mainHandler在新线程发出消息,在主线程处理接受的消息。

    looperHandler拥有looper后即可post(Runnable),发起新线程,然后通过mainHandler在新线程里发送消息到主线程的handler。

    这里创建两个handler,一个是mainHandler维护主线程的looper,一个是looperHandler拥护HandlerThread的looper。

    1.mainHandler处理消息,复写handlerMessage()方法处理消息。

    2.looperHandler应通过HandlerThread获取looper来构造,而且HandlerThread必须开启,否则得不到looper。

    3.looperHandler来post一个runnable对象,在runnable里复写run()方法,在里面用mainHandler发送方消息。

     1 package com.bvin.handler;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.HandlerThread;
     7 import android.os.Message;
     8 import android.util.Log;
     9 import android.view.View;
    10 import android.widget.Button;
    11 import android.widget.LinearLayout;
    12 import android.widget.LinearLayout.LayoutParams;
    13 import android.widget.TextView;
    14 
    15 public class MainActivity extends Activity {
    16     /** Called when the activity is first created. */
    17     
    18     private Handler loopHandler ;
    19     private Handler mainHandler; 
    20     private TextView tv;
    21     @Override
    22     public void onCreate(Bundle savedInstanceState) {
    23         super.onCreate(savedInstanceState);
    24         
    25         initViews();
    26         HandlerThread ht = new HandlerThread("handler thread");
    27         ht.start();//loopHandler的runnable这里先开始le,而mainHandler是点击之后
    28         loopHandler = new Handler(ht.getLooper());
    29         mainHandler= new Handler(){
    30 
    31             @Override
    32             public void handleMessage(Message msg) {
    33                 // TODO Auto-generated method stub
    34                 super.handleMessage(msg);
    35                 if(msg.what==2012){
    36                     
    37                     tv.setText(msg.getData().getString("s"));
    38                 }
    39                 
    40             }
    41         };
    42     }
    43     
    44     
    45     private void initViews(){
    46         
    47         LinearLayout layout = new LinearLayout(this);
    48         layout.setOrientation(LinearLayout.VERTICAL);
    49         LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
    50         tv = new TextView(this);
    51         tv.setText("本来");
    52         Button bt = new Button(this);
    53         
    54         bt.setText("开动");
    55         bt.setOnClickListener(new View.OnClickListener() {
    56             
    57             @Override
    58             public void onClick(View v) {
    59                 // TODO Auto-generated method stub
    60                 mainHandler.post(new Runnable(){
    61 
    62                     @Override
    63                     public void run() {
    64                         // TODO Auto-generated method stub
    65                         Log.e("mainHandler所在当前线程", ""+Thread.currentThread().getName());
    66                         //tv.setText("对不对");
    67                     }
    68                 });
    69                  
    70                 loopHandler.post(new Runnable(){
    71 
    72                     @Override
    73                     public void run() {
    74                         // TODO Auto-generated method stub
    75                         Log.e("loopHandler所在当前线程", ""+Thread.currentThread().getName());
    76                         Message msg = mainHandler.obtainMessage();
    77                         msg.what = 2012;
    78                         Bundle bundle = new Bundle();
    79                         bundle.putString("s", "从"+Thread.currentThread().getName()+"线程传过来的");
    80                         msg.setData(bundle);
    81                         msg.sendToTarget();
    82                     }
    83                 });
    84                 
    85             }
    86         });
    87         layout.addView(bt,params);
    88         layout.addView(tv,params);
    89         setContentView(layout);
    90         
    91     }
    92 }
  • 相关阅读:
    Combine 框架,从0到1 —— 4.在 Combine 中使用计时器
    Combine 框架,从0到1 —— 4.在 Combine 中使用通知
    Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
    Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布
    使用 Swift Package Manager 集成依赖库
    iOS 高效灵活地配置可复用视图组件的主题
    构建个人博客网站(基于Python Flask)
    Swift dynamic关键字
    Swift @objcMembers
    仅用递归函数操作逆序一个栈(Swift 4)
  • 原文地址:https://www.cnblogs.com/bvin/p/2784686.html
Copyright © 2011-2022 走看看