1.尝试在子线程中更新UI:
xml文件中:
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />MainActivity.java中:
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
new Thread(){
public void run() {
try {
Thread.sleep(1000);
txt.setText("jimo love");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}运行结果:
2.用Handler的post方法解决:
修改MainActivity.java文件:
TextView txt;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
new Thread(){
public void run() {
try {
Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText("jimo love");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}运行结果:
3.Handler的postDelayed方法:
Handler.postDelayed(runnable,time);含义:隔多少time执行一次runnable;
接下来让TextView每隔一秒钟变一次内容:
代码:
TextView txt;
Handler handler = new Handler();
private int cnt = 0;//计数
MyRunnable myR = new MyRunnable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
handler.postDelayed(myR, 1000);
}
class MyRunnable implements Runnable{
@Override
public void run() {
cnt++;
cnt = cnt % 3;
txt.setText("jimo"+cnt);
handler.postDelayed(myR, 1000);
}
}运行结果不言而喻。
4.Handler的handleMessage方法:
可以直接用message自带的两个参数传递参数:
TextView txt;
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
txt.setText(""+msg.arg1+" "+msg.arg2);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
new Thread(){
public void run() {
Message ms = new Message();
ms.arg1 = 100;
ms.arg2 = 80;
handler.handleMessage(ms);
};
}.start();
}运行结果:
但是如果有多个参数,可以创建一个对象来传递,这就用到Message对象的另一个属性:msg.obj:
TextView txt;
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
txt.setText(""+msg.obj);
};
};
class Car{
//为了方便就不封装了
public String name;
public float price;
@Override
public String toString() {
return "name: "+name+" price: "+price;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
new Thread(){
public void run() {
Message ms = new Message();
Car car = new Car();
car.name = "东风";
car.price = (float) 100.8;
ms.obj = car;
handler.handleMessage(ms);
};
}.start();
}运行结果:
当然,我们也可以通过handler.obtainMessage()方法拿到message对象
public void run() {
//Message ms = new Message();
Message ms = handler.obtainMessage();
Car car = new Car();
car.name = "东风";
car.price = (float) 100.8;
ms.obj = car;
handler.handleMessage(ms);
};然而,我们还可以通过message的sendToTarget()方法发送消息:
ms.obj = car;
ms.sendToTarget();
//handler.handleMessage(ms);运行结果都是一样的。
5.Handler的removeCallbacks()方法:
可以移除一个handler事件,如上例3,增加一个Button按钮,但点击按钮,则移除MyRunnable事件:
btn_remove = (Button)findViewById(R.id.btn_remove);
btn_remove.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.removeCallbacks(myR);
}
});6.Handler的CallBack函数:
当callback函数返回true时,只会打印yes,返回false时yes和no都会打印,所以可以在callback里执行逻辑,不成功时执行后面的handleMessage:
TextView txt;
Button btn_remove;
Callback call = new Callback() {
@Override
public boolean handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "yes", Toast.LENGTH_SHORT).show();
return true;
}
};
Handler handler = new Handler(call){
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "no", Toast.LENGTH_SHORT).show();
}
};
private int cnt = 0;//计数
MyRunnable myR = new MyRunnable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
btn_remove = (Button)findViewById(R.id.btn_remove);
btn_remove.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.sendEmptyMessage(1);
}
});
// handler.postDelayed(myR, 1000);
}
class MyRunnable implements Runnable{
@Override
public void run() {
cnt++;
cnt = cnt % 3;
txt.setText("jimo"+cnt);
handler.postDelayed(myR, 1000);
}
}版权声明:本文为jimo_lonely原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。