• 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 }
  • 相关阅读:
    php防止刷流量攻击
    PHP序列化变量的4种方法
    php递归操作目录 递归对参数转义
    php 图像裁剪(自定义裁剪图片大小)
    jquery实现点击文字后变成文本框且可修改
    mysql查看表注释和字段注释的方法
    php 获取中文字符串首字母
    Nginx.conf配置
    光盘作为yum源
    win7下安装mongodb
  • 原文地址:https://www.cnblogs.com/bvin/p/2784686.html
Copyright © 2020-2023  润新知