package com.example.handler_01;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tv);
new Thread(new Runnable() {
@Override
public void run() {
try {
// android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("HAHA");
}
});
}catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
在线程中更新UI 要用handler
handler 是什么
android 更新ui的机制 消息处理的机制
生命周期的回调的方法都是通过handler
新创建一个线程会绑定到message queue 中
package com.example.handler_01;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Handler handler = new Handler();
private int[] images = {
R.drawable.image1,R.drawable.image2,R.drawable.image3
};
private int index = 0;
private MyRunnable myRunnable = new MyRunnable();
class MyRunnable implements Runnable{
@Override
public void run() {
index++;
index = index % 3;
imageView.setImageResource(images[index]);
//要做的事情,这里再次调用此Runnable对象,以实现每两秒实现一次的定时器操作
handler.postDelayed(this,1000);
}
}
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.iv);
handler.postDelayed(myRunnable,1000);
}
}
package com.example.handler_01;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.handler_01.entity.Person;
public class Main2Activity extends AppCompatActivity{
private TextView textView;
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
Person p = (Person) msg.obj;
String name = p.getName();
Integer age = p.getAge();
textView.setText(msg.arg1+""+msg.arg2+msg.obj+" name "+name);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView = (TextView) findViewById(R.id.tv2);
new Thread(new Runnable() {
@Override
public void run() {
//message
Message message = handler.obtainMessage();
message.arg1 = 12;//这玩意儿是INT类型
message.arg2 = 14;
Person person = new Person("zhangsan",12);
message.obj = person;
handler.sendMessage(message);
}
}).start();
}
}