1.
new Handler().post(new Runnable() { @Override public void run() { mTest.setText("post");//更新UI } });
2.子Thread中新建Handler;
如下a1.start(); a1是子Thread,在子Thread中,如果想用Handler,因为子Thread默认没有Looper, 所以要先Looper.prepare();而后在合适的地方Looper.loop();这样才不会报错
如果想让子Thread中通过handleMsg(), 更新主线程的UI,new Handler(Looper.getMainLooper())
Log如下:
02-12 00:53:55.459 12806-12806/com.example.suruixue.myapplication E/SplashActivity: srx-oncreate-show SlpahActivity
02-12 00:53:55.618 12806-12806/com.example.suruixue.myapplication D/SplashActivity: srx---oncreate-tid=2
02-12 00:53:55.623 12806-12806/com.example.suruixue.myapplication E/SplashActivity: srx--onStart
02-12 00:53:55.632 12806-12806/com.example.suruixue.myapplication E/SplashActivity: srx--onResme00000
02-12 00:53:55.633 12806-12822/com.example.suruixue.myapplication D/SplashActivity: srx---a1thread-out-tid=263
02-12 00:53:55.635 12806-12822/com.example.suruixue.myapplication D/SplashActivity: srx--handler-sendmsg,tid=263
02-12 00:53:55.695 12806-12806/com.example.suruixue.myapplication D/SplashActivity: srx---a1thread-in-tid=2 //跟mHandler相关的handleMsg, post,相关的都是跑在主线程中
02-12 00:53:55.696 12806-12806/com.example.suruixue.myapplication D/SplashActivity: srx---inhandler-handlemsg-tid=2 //跟mHandler相关的handleMsg, post,相关的都是跑在主线程中
srx--handleMsg--msg=1
如果想让子Thread中通过handleMsg(), 更新子线程的UI,new Handler(),里面参数啥也不用传。
Log如下:
02-12 01:20:20.000 16808-16808/com.example.suruixue.myapplication E/SplashActivity: srx-oncreate-show SlpahActivity
02-12 01:20:20.160 16808-16808/com.example.suruixue.myapplication D/SplashActivity: srx---oncreate-tid=2
02-12 01:20:20.174 16808-16808/com.example.suruixue.myapplication E/SplashActivity: srx--onStart
02-12 01:20:20.186 16808-16808/com.example.suruixue.myapplication E/SplashActivity: srx--onResme00000
02-12 01:20:20.186 16808-16824/com.example.suruixue.myapplication D/SplashActivity: srx---a1thread-out-tid=267
02-12 01:20:20.187 16808-16824/com.example.suruixue.myapplication D/SplashActivity: srx--handler-sendmsg,tid=267
02-12 01:20:20.188 16808-16824/com.example.suruixue.myapplication D/SplashActivity: srx---a1thread-in-tid=267 //Handler()获取的是自己子线程的Looper,跟mHandler想的post,handleMsg()都是跑在子线程中,都是子线程的tid.
srx---inhandler-handlemsg-tid=267
srx--handleMsg--msg=1
package com.example.suruixue.myapplication; import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class SplashActivity extends AppCompatActivity implements Thread.UncaughtExceptionHandler{ private String TAG = "SplashActivity"; private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG,"srx-oncreate-show SlpahActivity"); setContentView(R.layout.activity_splash); mText = findViewById(R.id.splash_text); Log.d(TAG,"srx---oncreate-tid="+Thread.currentThread().getId()); } private void myInit(){ Thread a1= new Thread(new Runnable() { @Override public void run() { Log.d(TAG,"srx---a1thread-out-tid="+Thread.currentThread().getId()); Looper.prepare(); Handler mHandler = new Handler(Looper.getMainLooper()){
//Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.d(TAG,"srx---inhandler-handlemsg-tid="+Thread.currentThread().getId()); Log.d(TAG,"srx--handleMsg--msg="+msg.what); mText.setText("handleMesg"); } }; mHandler.post(new Runnable() { @Override public void run() { Log.d(TAG,"srx---a1thread-in-tid="+Thread.currentThread().getId()); mText.setText("postRunnable"); } }); Log.d(TAG,"srx--handler-sendmsg,tid="+Thread.currentThread().getId()); mHandler.sendEmptyMessage(1); Looper.loop(); } }); a1.start(); } @Override protected void onStart() { Log.e(TAG,"srx--onStart"); super.onStart(); } @Override protected void onResume() { super.onResume(); myInit(); Log.e(TAG,"srx--onResme00000"); } @Override protected void onStop() { Log.e(TAG,"srx--onStop"); super.onStop(); } @Override protected void onPause() { Log.e(TAG,"srx--onPause"); super.onPause(); } @Override protected void onDestroy() { Log.e(TAG,"srx--onDestroy"); super.onDestroy(); } }
3.在主线程中新建Handler,在子线程中用mHandler.post发送消息//实际还是跑在主线程中
Log如下
02-12 01:26:25.789 17831-17831/com.example.suruixue.myapplication E/SplashActivity: srx-oncreate-show SlpahActivity
02-12 01:26:25.963 17831-17831/com.example.suruixue.myapplication D/SplashActivity: srx---oncreate-tid=2
02-12 01:26:25.974 17831-17831/com.example.suruixue.myapplication E/SplashActivity: srx--onStart
02-12 01:26:25.987 17831-17831/com.example.suruixue.myapplication E/SplashActivity: srx--onResme00000
02-12 01:26:25.988 17831-17850/com.example.suruixue.myapplication D/SplashActivity: srx---a1thread-out-tid=271
02-12 01:26:25.989 17831-17850/com.example.suruixue.myapplication D/SplashActivity: srx--handler-sendmsg,tid=271
02-12 01:26:26.050 17831-17831/com.example.suruixue.myapplication D/SplashActivity: srx---a1子thread-inpost-tid=2 //mHandler.post虽然写在子Thread中,但是实际还是跑在主线程中,从tid能看出来
02-12 01:26:26.051 17831-17831/com.example.suruixue.myapplication D/SplashActivity: srx---inhandler-handlemsg-tid=2
srx--handleMsg--msg=1
package com.example.suruixue.myapplication; import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class SplashActivity extends AppCompatActivity implements Thread.UncaughtExceptionHandler{ private String TAG = "SplashActivity"; private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG,"srx-oncreate-show SlpahActivity"); setContentView(R.layout.activity_splash); mText = findViewById(R.id.splash_text); Log.d(TAG,"srx---oncreate-tid="+Thread.currentThread().getId()); } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.d(TAG,"srx---inhandler-handlemsg-tid="+Thread.currentThread().getId()); Log.d(TAG,"srx--handleMsg--msg="+msg.what); mText.setText("handleMesg"); } }; private void myInit(){ Thread a1= new Thread(new Runnable() { @Override public void run() { Log.d(TAG,"srx---a1thread-out-tid="+Thread.currentThread().getId()); mHandler.post(new Runnable() { @Override public void run() { Log.d(TAG,"srx---a1子thread-inpost-tid="+Thread.currentThread().getId()); mText.setText("postRunnable"); } }); Log.d(TAG,"srx--handler-sendmsg,tid="+Thread.currentThread().getId()); mHandler.sendEmptyMessage(1); } }); a1.start(); } @Override protected void onStart() { Log.e(TAG,"srx--onStart"); super.onStart(); } @Override protected void onResume() { super.onResume(); myInit(); Log.e(TAG,"srx--onResme00000"); } @Override protected void onStop() { Log.e(TAG,"srx--onStop"); super.onStop(); } @Override protected void onPause() { Log.e(TAG,"srx--onPause"); super.onPause(); } @Override protected void onDestroy() { Log.e(TAG,"srx--onDestroy"); super.onDestroy(); } }