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();
}
}
浙公网安备 33010602011771号