耗时操作不能在主线程完成,必须要在子线程完成但是子线程不能更新UI所以我们可以用Handler
Handler里有一个队列,先进入的先出,发一下消息就执行一次
Handler的定义:
主要接受子线程发送的数据,并用此数据配合主线程更新UI
使用Handler
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
Log.e("延时两秒","延时两秒检索");
mRecycle_view.onRefreshComplete();
}
}, 3000);
}
还可以
package com.example.handler_text;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends Activity {
// 1,创建Handler
public Handler mHandler=new Handler(){
// 2,重写handleMessage方法
public void handleMessage(Message msg){
switch(msg.what){//判断那个消息
case 1:
Log.e("tag", "333"+msg.obj);//更新UI
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//耗时操作用分线程
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String name="小明";
Message message = mHandler.obtainMessage();
message.obj=name;
message.what=1;//用来辨识消息的编号
// mHandler.sendMessage(message); //发送消息
// mHandler.sendEmptyMessage(123);//空发送,传入编号
mHandler.sendEmptyMessageDelayed(200, 5000);//空延迟发送
}
}).start();
}
}
还可以用runOnUiThread
new Thread() {//创建子线程
public void run() {
for (int i = 0; i < int1; i++) {
try {
// 休息一会
Thread.sleep(500);//每循环一次就睡一毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 不能在分线程里面直接更新UI
// runOnUiThread返回到主线程执行
runOnUiThread(new Runnable() {
public void run() {
animationDrawable.stop();//停止动画
current = animationDrawable.getCurrent();//获得当前帧的图片
}
});
};
}.start();
还可以用单个Handler发送空的延迟来更新UI
public Handler mHandler=new Handler(){
// 2,重写handleMessage方法
public void handleMessage(Message msg){
animationDrawable.stop();//停止动画
current = animationDrawable.getCurrent();//获得当前帧的图片
}
};
mHandler.sendEmptyMessageDelayed(2, int1*180);