2020年顺手整合了之前关于Handler的俩篇新手文章

大家都清楚在Android中,我们是不允许在子线程进行UI处理,如果你这样操作会导致程序ANR崩溃,所以针对这种场景我们就需要使用到Handler进行子主线程交互

当然Handler的用处不止这些,因为我们把耗时操作都放在子线程,如网络请求图片下载等我们也会开启子线程进行操作,处理结果如涉及UI更改部分都会通过handler传到主线程进行设置 ~


入门之初

  • Handler入门使用
  • Handler替代方式


Handler入门使用

均已注释,直接上代码 ~

MainActivity

package com.example.handlerdemo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	public final int MessagerUI = 0;
	private Button mBtn;
	private Handler handler;
	private TextView mTv;
	
	/**
	 * 使用步骤:
	 * 1.创建Handler,用于发送与接收消息
	 * 2.创建、并开始子线程,然后发送消息
	 * 3.重写Handler内置的handleMessage方式。用于处理消息
	 * 原理:
	 * 子线程发送消息之后,信息进入MessageQueue中,Hanler中内置有Looper轮询器,回遍历信息管道,从而进行消息处理
	 * */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				if(msg.what==MessagerUI){
					mTv.setText("handleMessage接收后的消息");
				}
			}
		};
		
		mBtn = (Button) findViewById(R.id.btn);
		mTv = (TextView) findViewById(R.id.tv_content);
		
		mBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//这里没开启子线程,是当年的不成熟,就不做补救了,当作纪念
				Message message = new Message();
				message.what=MessagerUI;
				handler.sendMessage(message);
			}
		});
	}
}

activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    <Button 
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:id="@+id/btn"
        android:text="Handler刷新UI视图"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
         android:id="@+id/tv_content"
        android:text="Up Day" />
</LinearLayout>

发布标题:Android进阶之路 - Handler的详细使用(二)
 发布时间: 2017-03-11 23:56:56
当前状态:已删除

Handler替代方式

Handler作用主要在于子主线程的一个交互,除了Handler之外runOnUiThread()也是一种很好的处理方式

个人认为俩者从表面来看不同之处在于runOnUiThread()使用方便,但是不适合管理;相反Handler我们可以完全可以通过what进行统一管理,相反每次子线程 发消息时需要多些几行代码

入门篇讲的是在主线程进行Handler创建,之后在子线程通过handler进行发送信息到主线程,至于俩这之间如何交互的话,其实应该先了解Looper.loop的方法轮询信息池

那么我们这篇要用到的是runOnUiThread()方法的使用,如果问俩者的区别的话,我认为在主线程创建Handler的话,更方便我们后期的维护,因为其更统一化管理,而使用runOnUiThread()的话,有时候却更为方便,废话不多说,一个Demo带给大家,初学者一看便知。

MainActivity

package com.example.handlerui;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

//最终效果,Text显示的数据改变为我们输入的信息
public class MainActivity extends Activity {

	private TextView mTv;
	private EditText mEt;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mEt = (EditText) findViewById(R.id.et);
		mTv = (TextView) findViewById(R.id.tv);

		/**
		 * 子线程获取数据后,渲染到UI 
		 * 1.开启子线程获取数据 
		 * 2.获取数据之后使用runOnUiThread()的方法进行主线程UI渲染
		 * */
		new Thread(new Runnable() {
			@Override
			public void run() {
				mTv.setOnClickListener(new OnClickListener() {
					private String data;
					@Override
					public void onClick(View v) {
						data = mEt.getText().toString();
						if (TextUtils.isEmpty(data)) {
							Toast.makeText(MainActivity.this, "请输入信息", 0).show();
						} else {
							runOnUiThread(new Runnable() {
								public void run() {
									mTv.setText(data);
								}
							});
						}
					}
				});
			};
		}).start();
	}
}

activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
	
    <EditText 
         android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et"
        />
        
    <TextView
        android:id="@+id/tv"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UIThread使用" />
</LinearLayout>