一般用与定时任务和不同线程间的通信。
Handler.sendMessage();
Handler.post();
handler.sendMessageAtTime(message, SystemClock.uptimeMillis()+3000); handler.sendMessageDelayed(message,2000);/*两秒后*/
handler.post(runnable); handler.postDelayed(runnable,2000);
最简单实现
将耗时操作放在子线程
package com.example.handlerproject;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
static String Tag="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
/**
* UI线程
* */
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView=findViewById(R.id.textview);
//创建handler
Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
/**
*主线程接到子线程发出的消息处理
**/
//处理消息
Log.i(Tag,"handlermessage:"+msg.what);
if (msg.what==1001){
textView.setText("imooc");
}
}
};
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//有可能有大量耗时操作
/**
* 子线程
* */
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//通知UI更新
handler.sendEmptyMessage(1001);
}
}).start();
}
});
}
}
静态Handler
防止activity被清理内存泄漏
package com.example.handler2;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;
import java.lang.ref.WeakReference;
public class MainActivity extends AppCompatActivity {
//倒计时标记code
private int COUNTDOWN_TIME_CODE = 100001;
//倒计时最大值
private int MAX_COUNT = 10;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到控件
textView = findViewById(R.id.countdownTimeTextView);
//创建handler
CountdownTimeHandler handler = new CountdownTimeHandler(MainActivity.this) ;
//新建了消息Message
Message message = Message.obtain();
message.what = COUNTDOWN_TIME_CODE;
message.arg1= MAX_COUNT;
//第一次发送
handler.sendMessageDelayed(message, 1000);
}
public static class CountdownTimeHandler extends Handler {
//弱引用
final WeakReference<MainActivity> mainActivityWeakReference;
public CountdownTimeHandler(MainActivity activity) {
this.mainActivityWeakReference =new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
MainActivity activity=mainActivityWeakReference.get();
switch (msg.what){
case 100001:
int value= msg.arg1;
activity.textView.setText(String.valueOf(value--));
//循环发的消息控制
if (value>=0){
Message message=Message.obtain();
message.what=100001;
message.arg1=value;
sendMessageDelayed(message,10000);
}
break;
}
}
}
}