浅谈android多线程中的消息传递

 一个Android应用程序被创建的时候都会创建一个UI主线程,但是有时我们会有一些比较耗时的操作,为了防止阻塞UI主线程,我们会将耗时的操作放到子线程中进行处理,处理完之后操作UI,但是Android不允许子线程操作UI,违背了Android单线程模型的原则(即Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行),所以Android通过Handler消息机制来实现线程之间的通讯。

Handler直接继承自ObjectHandle对象可以处理Message或是Runnable对象。每个Handler对象独立拥有一个单独的线程,并关联一个消息线程,Handler对象可以把MessageRunnable对象压入消息队列或是从队列中销毁,也可以从消息队列中拿出消息进行处理。

Handler压入消息有两种方法:postsendMessage

Post


package com.example.threadapplication;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private  Button postButton;
    private  Button postTimeButton;
    private Button postDelayedButton;
    private TextView textView;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        postButton = (Button)findViewById(R.id.button1);
        postTimeButton = (Button)findViewById(R.id.button2);
        postDelayedButton = (Button)findViewById(R.id.button3);
        textView = (TextView)findViewById(R.id.TestView1);

        postButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //textView.setText("使用post方法传递消息");
                        //该做法不可行,在子线程中无法修改UI线程中的控件
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText("使用post方法传递消息");
                            }
                        });

                    }
                }).start();
            }
        });


        postTimeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        handler.postAtTime(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText("使用postTime方法传递消息");
                            }
                        },3000);

                    }
                }).start();
            }
        });

        postDelayedButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText("使用postDelayed方法传递消息,延迟3秒");
                            }
                        },3000);

                    }
                }).start();
            }
        });


    }
}
Message:

如果使用sendMessage方法传递消息,则需要构造一个Message对象。在构造Message对象时,不推荐直接使用其构造方法,而是使用Message.obtain()。

在Handler中需要重写其handleMessage方法

package com.example.threadapplication;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

/**
 * Created by 刘航伸 on 2017/5/26.
 */

public class MessageActivity extends AppCompatActivity {
    private Button messageButton;
    private TextView textView;
    private  Handler handler = new Handler() {
          @Override
         public void handleMessage(Message msg) {
              textView.setText(msg.obj.toString());
          }
    };
 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.message_activity);
        messageButton = (Button)findViewById(R.id.button1);
        textView = (TextView)findViewById(R.id.textView);
        
        messageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message message = Message.obtain();
                        message.obj = "sendMessage";
                        handler.sendMessage(message);

                    }
                }).start();
            }
        });
     


    }

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值