1.

下面调用的是run()不是start(), 所以不是新起了一个子线程,还是在主线程中,在run()中打印Thread的tid,跟主线程一样,所以一般不会这样用,相当于主线程给主线程发消息,处理。
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();
    }



}

  

posted on 2021-05-18 20:13  snowdrop  阅读(224)  评论(0编辑  收藏  举报