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>