全局Handler封装,优雅的书写handler的UI刷新界面
在Android开发中我们会经常使用handler进行ui界面的刷新,这主要是源于Android的线程机制和消息机制。Android不允许开发者在主线程中刷新ui界面,所以我们会经常用到消息机制,但是频繁的创建handler有可能导致内存泄漏,而且容易造成代码冗余,影响代码质量,所以我们要设置一个全局的handler,通过接口实现来实现ui刷新。
请看代码:
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class GlobalHandler extends Handler{
private HandleMsgListener listener;
private String Tag = GlobalHandler.class.getSimpleName();
//使用单例模式创建GlobalHandler
private GlobalHandler(){
Log.e(Tag,"GlobalHandler创建");
}
private static class Holder{
private static final GlobalHandler HANDLER = new GlobalHandler();
}
public static GlobalHandler getInstance(){
return Holder.HANDLER;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (getHandleMsgListener() != null){
getHandleMsgListener().handleMsg(msg);
}else {
Log.e(Tag,"请传入HandleMsgListener对象");
}
}
public interface HandleMsgListener{
void handleMsg(Message msg);
}
public void setHandleMsgListener(HandleMsgListener listener){
//getInstance();
this.listener = listener;
}
public HandleMsgListener getHandleMsgListener(){
return listener;
}
//将消息发送给消息队列
public static void send(int what,Object object,GlobalHandler mHandler){
Message message = Message.obtain();
message.what = what;
message.obj = object;
mHandler.sendMessage(message);
//mHandler.removeCallbacksAndMessages(null); //清空消息
}
public static void sendShow(int what, Object object, HandleMsgListener context){
GlobalHandler handler = GlobalHandler.getInstance();
handler.setHandleMsgListener(context);
send(what,object,handler);
handler.removeCallbacks(null); //用完就销毁
}
}
使用方法:
public class MainActivity extends AppCompatActivity implements GlobalHandler.HandleMsgListener {
private TextView mtv;
private int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtv = findViewById(R.id.mText);
}
public void onClick(View view){
switch (view.getId()){
case R.id.mUI:
GlobalHandler.sendShow(0x01,"已完成改变的线程"+(i++),MainActivity.this);
break;
}
}
@Override
public void handleMsg(Message msg) {
switch (msg.what){
case 0x01:
mtv.setText(msg.obj.toString());
break;
}
}
效果图:
根据这篇博客有感而发:全局Handler的封装_全局的handler-CSDN博客