Handler是面试经常遇到的,至少网上和师兄们都这么说,吓得我赶紧抓紧时间复习这个知识点。
Handler是消息处理机制,用于子线程更新UI操作,如果安卓在子线程更新UI不遵循这种机制的话,
那么就会抛出异常信息。
首先试试不使用Handler机制看看
布局文件
"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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xieth.as.handlerdemo.HandlerActivity01"
>
"@+id/id_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:textColor="@android:color/background_dark"
/>
一个按钮和一个文本,按钮设置事件改变文本。
主活动.java
package com.xieth.as.handlerdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class HandlerActivity01 extends AppCompatActivity implements View.OnClickListener {
private Button btn1 = null;
private TextView tv1 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler01);
initViews();
}
private void changeFromThread() {
new Thread(){
@Override
public void run() {
tv1.setText("改变文字了!!");
}
}.start();
}
private void initViews() {
btn1 = (Button) findViewById(R.id.id_btn1);
btn1.setOnClickListener(this);
tv1 = (TextView) findViewById(R.id.id_tv1);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.id_btn1:
changeFromThread();
break;
default:
break;
}
}
}
可以看到的确抛出了异常,那么试试Handler机制
private void changeFromThread() {
new Thread(){
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
tv1.setText("改变文字了!!");
}
});
}
}.start();
}
延迟方法
布局文件增加一个ImageView
"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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xieth.as.handlerdemo.HandlerActivity01"
>
"@+id/id_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:textColor="@android:color/background_dark"
/>
"@+id/id_imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:src="@mipmap/ic_launcher"
/>
在主活动增加几个变量
private ImageView imageView = null;
private int resId[] = {R.mipmap.pic1, R.mipmap.pic2, R.mipmap.pic3};
private int index = 0;
private Handler mHandler = new Handler();
private MyRunnable myRunnable = new MyRunnable();
自定义一个类用于图片的变化操作
class MyRunnable implements Runnable {
@Override
public void run() {
index++;
index %= 3;
imageView.setImageResource(resId[index]);
mHandler.postDelayed(myRunnable, 1000);
}
}
最后在按钮的设置事件里面开启线程
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.id_btn1:
mHandler.postDelayed(myRunnable, 1000);
break;
default:
break;
}
}
既然可以设置这种转换事件,同样也可以进行消除事件。
只需要一行代码即可
case R.id.id_btn2:
mHandler.removeCallbacks(myRunnable);
break;
发送消息更新UI
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tv1.setText("->"+msg.arg1);
}
};
然后在事件里面发送消息:
case R.id.id_btnTv:
Message message = new Message();
message.arg1 = 12345;
mHandler.sendMessage(message);
break;
如果从服务器上获取一段网络数据,肯定不是向一个变量那么简单,比如是哈希表或者是
ArrayList这类数据,那么也可以进行传递。
自定义Person类作为数据
class Person {
public int age;
public String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
然后更新UI
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tv1.setText(msg.obj.toString());
}
};
设置数据
case R.id.id_btnTv:
Message message = new Message();
Person person = new Person(18, "神一样的男人");
message.obj = person;
mHandler.sendMessage(message);
break;
记录一下,这只是Handler冰山一角,明天继续复习!