—————-复写handler的handleMessage方式——————-
//在UI线程中创建Handler对象 private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { //根据Message的内容做相应的更新(一般使用msg.what,也可进行数据传递) } } //在非UI线程中(子线程)使用Handler发送更新消息 int UPDADE_UI = 1; Messager msg = Message.obtain(); msg.what = UPDATE_UI; mHandler.sendMessage(msg);—————-handler.post方式——————-
//在UI线程中创建Handler对象 private Handler handler = new Handler(); //在子线程中调用Handler对象更新 handler.post(new Runnable() { @Override public void run() { //在此处直接更新UI,例如mText.setText("更新"); } });将一个Runnable添加到消息队列,Runnable将在UI线程运行。 This method can be invoked from outside of the UI thread only when this View is attached to a window.即必须保证该View被添加到窗口。
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.btn_show); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { //此处处于子线程内 button.post(new Runnable() { @Override public void run() { button.setText("liuconen"); } }); } }).start(); } });public final void runOnUiThread (Runnable action) 在UI线程中执行,如果当前线程是UI线程是UI线程,动作将被立即执行; 如果当前线程不是UI线程,动作将被发送到UI线程的消息队列(按照消息队列的顺序执行) 示例:
button = (Button) findViewById(R.id.btn_show); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { //此处直接更新UI button.setText("liuconen"); } }); } }).start(); } });