package com.example.fafa.justabouthandler; import android.os.Handler; import android.os.Message; 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 implements Handler.Callback{ private static final int UPDATE_TEXT = 100; private TextView mTetx; private Button mChangeBt; private Handler handler=new Handler(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mTetx = (TextView) findViewById(R.id.my_text); mChangeBt = (Button) findViewById(R.id.change); mChangeBt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { // 1 mTetx.setText("bye,world"); Message message= new Message(); message.what=UPDATE_TEXT; handler.sendMessageDelayed(message,5000); // handler.sendEmptyMessageDelayed(UPDATE_TEXT,5000); //这个是方法二只需要一句代码简单些 /*当你点进sendEmptyMessageDelayed的时候你会发现 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) { Message msg = Message.obtain(); msg.what = what; return sendMessageDelayed(msg, delayMillis); } ,其实这两个方法是一样一样的,一个传Message类型的msg,一个传int类型的what,传what的,最终会转为msg。 */ } }).start(); } }); } @Override public boolean handleMessage(Message msg) { switch (msg.what) { case UPDATE_TEXT: mTetx.setText("bye,world"); break; } return false; } }
在上面的代码中布局中就只有一个TextView和一个Button控件 给按钮设置一个监听点击的时候开一个线
程,因为安卓是线程不安全的如果在子线程中直接像我的注释1一样直接更新UI那么程序就会crash掉,这
时候就应该像代码写的一样直接利用handler来发送消息,handlerMessage是在主线程中运行的就会接收
此消息然后就能更新UI了