Java多子类继承同一父类实例化问题

        最近在学安卓的过程中发现了这么一个业务场景,现有一抽象类BaseFragment与三个子类(BluetoothManage、ControlCentral、WifiManage)。

public abstract class BaseFragment extends Fragment {
    private Context mContext;

    protected Handler wifiManageHandler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            handleMsg(msg);
        }
    };
    protected Handler controlCentralHandler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            handleMsg(msg);
        }
    };

    //消息处理
    abstract void handleMsg(@Nullable Message msg);

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getContext();
    }
}

        需要使用Handler进行子类之间的消息传递,由各个子类分别重写handleMsg方法,即各自实现消息处理,比如在WifiManage类中调用父类的controlCentralHandler 发送消息时,实际处理消息的并非ControlCentral 类重写的handleMsg方法,而是指向父类的handleMsg方法,造成一种重写方法失效的假象,这是因为每个子类在初始化时都会对父类进行初始化,即WifiManage类与ControlCentral类所持有的父类对象并非同一实例,因而各自重写的handleMsg方法并不互通。

public class WifiManage extends BaseFragment {
    public WifiManage() {
        // Required empty public constructor
    }
    public static WifiManage newInstance() {
        WifiManage fragment = new WifiManage();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_wifi_manage, container, false);
        return v;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        super.controlCentralHandler.sendEmptyMessage(9);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)         
    {
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onDestroy() {
        super.onDestroy(); 

    }

    @Override
    void handleMsg(@Nullable Message msg) {
        
    }
}
public class ControlCentral extends BaseFragment {
    public ControlCentral() {
    }

    public static ControlCentral newInstance() {
        ControlCentral fragment = new ControlCentral();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_control_central, container, false);
        return v;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
     
    }

    @Override
    void handleMsg(@Nullable Message msg) {
        if (msg.what == 9 ){
            Log.e("TAG","收到消息了");
        }
    }
}

        我采用的解决办法是使用单例模式,因为这里不能使不同的子类在实例化时拿到的是同一个父类实例(至少我没有想到解决方法),因而可以将所有handler共同放在一个工具类中,该工具类的设计采用单例模式,即可解决该问题。

public class HandlerUtils{
    private static HandlerUtils handlerUtils;
    private HandlerCallBack handlerCallBack,wifiManageHandlerCallBack,controlCentralHandlerCallBack,bluetoothManageHandlerCallBack;//处理回调
    private Handler mHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            handlerCallBack.handleMessage(msg);
        }
    };
    protected Handler wifiManageHandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            wifiManageHandlerCallBack.handleMessage(msg);
        }
    };


    protected Handler controlCentralHandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            controlCentralHandlerCallBack.handleMessage(msg);
        }
    };

    protected Handler bluetoothManageHandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            bluetoothManageHandlerCallBack.handleMessage(msg);
        }
    };


    public static synchronized HandlerUtils getInstance(){
        if (handlerUtils == null){
            handlerUtils = new HandlerUtils();
        }
        return handlerUtils;
    }

    public HandlerCallBack getHandlerCallBack() {
        return handlerCallBack;
    }

    public void setHandlerCallBack(HandlerCallBack handlerCallBack) {
        this.handlerCallBack = handlerCallBack;
    }

    public HandlerCallBack getWifiManageHandlerCallBack() {
        return wifiManageHandlerCallBack;
    }

    public void setWifiManageHandlerCallBack(HandlerCallBack wifiManageHandlerCallBack) {
        this.wifiManageHandlerCallBack = wifiManageHandlerCallBack;
    }

    public HandlerCallBack getControlCentralHandlerCallBack() {
        return controlCentralHandlerCallBack;
    }

    public void setControlCentralHandlerCallBack(HandlerCallBack controlCentralHandlerCallBack) {
        this.controlCentralHandlerCallBack = controlCentralHandlerCallBack;
    }

    public HandlerCallBack getBluetoothManageHandlerCallBack() {
        return bluetoothManageHandlerCallBack;
    }

    public void setBluetoothManageHandlerCallBack(HandlerCallBack bluetoothManageHandlerCallBack) {
        this.bluetoothManageHandlerCallBack = bluetoothManageHandlerCallBack;
    }

    public Handler getHandler() {
        return mHandler;
    }

    public Handler getWifiManageHandler() {
        return wifiManageHandler;
    }

    public Handler getControlCentralHandler() {
        return controlCentralHandler;
    }

    public Handler getBluetoothManageHandler() {
        return bluetoothManageHandler;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值