Toggle Dns Check到底干了什么

本文详细探讨了在Android系统中PdpConnection.java文件内针对DNS race condition问题的解决方案。特别是当DNS服务器地址为空时,通过一种迂回的方式解决此问题,并避免对默认接入点名称(APN)的影响。
被这个设置困扰了很久很久了。今天总算心血来潮。挖掘了一下,得到的答案如下: 主要关键点在 frameworks/base/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java 中 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 if (NULL_IP.equals(dnsServers[0]) && NULL_IP.equals(dnsServers[1]) && !((GSMPhone) phone).isDnsCheckDisabled()) { // Work around a race condition where QMI does not fill in DNS: // Deactivate PDP and let DataConnectionTracker retry. // Do not apply the race condition workaround for MMS APN // if Proxy is an IP-address. // Otherwise, the default APN will [...]
告诉我下面代码中mIsOperatingDDNS的作用,这个变量和设置页面属性有何关系, public class DDNSFragment extends BaseFragment<FragmentDdnsBinding> { private DDNSViewModel mViewModel = null; private boolean mIsOperatingDDNS = false; private boolean mIsNeedInit = true; private boolean mIsChangeFromUser = false; private LayoutDdnsApChangedBinding layoutDdnsApChangedBinding; private LayoutDdnsRegisterBinding layoutDdnsRegisterBinding; private LayoutDdnsOfflineBinding layoutDdnsOfflineBinding; @Override protected FragmentDdnsBinding bindView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return FragmentDdnsBinding.inflate(inflater, container, false); } @Override protected void subscribeViewModel(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { mViewModel = new ViewModelProvider(this, new MeshViewModelFactory(this)).get(DDNSViewModel.class); initView(); subscribeToViewModel(); TPAccessibilityUtilsKt.initAccessDelegate(mViewBinding.ddnsSwitchTip) .setContentDescriptionProvider(() -> mViewBinding.ddnsSwitchTip.getText().toString()); } @Override protected String getFragmentScreenName() { return GATrackerDefine.Screen.SCREEN_DDNS; } @Override public void onResume() { super.onResume(); if (mIsNeedInit) { mIsOperatingDDNS = true; mViewModel.getDDNSSetting(); mIsNeedInit = false; } } private void initView() { mViewBinding.ddnsListEmpty.setOnInflateListener((viewStub, view) -> { layoutDdnsRegisterBinding = LayoutDdnsRegisterBinding.bind(view); layoutDdnsRegisterBinding.ddnsBlankViewRegister.setBlankLabel(getDdnsRegisterText()); TextView textView = layoutDdnsRegisterBinding.ddnsBlankViewRegister.findViewById(R.id.tv_label); textView.setMovementMethod(SpannableStringInstance.getInstance().getLinkMovementMethod()); layoutDdnsRegisterBinding.ddnsBlankViewRegister.setBlankActionClickListener(v -> { if (mViewModel.isDDNSReadOnly()) { onPageReadOnly(layoutDdnsRegisterBinding.getRoot()); } else { mIsChangeFromUser = true; DataTracker.getInstance().trackEvent(GATrackerDefine.Category.CATEGORY_BUTTON_CLICKS, GATrackerDefine.Action.ACTION_ADVANCED_DDNS, GATrackerDefine.Label.LABEL_ADVANCED_DDNS_REGISTER); new DDNSEditFragment().show(getChildFragmentManager(), DDNSEditFragment.class.getName()); } }); if (mViewModel.isDDNSReadOnly()) { layoutDdnsRegisterBinding.managerTipLayout.tipTextTv.setGravity(Gravity.CENTER); layoutDdnsRegisterBinding.managerTipLayout.getRoot().setVisibility(View.VISIBLE); } }); mViewBinding.ddnsListOffline.setOnInflateListener((viewStub, view) -> { layoutDdnsOfflineBinding = LayoutDdnsOfflineBinding.bind(view); layoutDdnsOfflineBinding.ddnsBlankViewOffline.setBlankActionClickListener(v -> { if (mViewModel.isDDNSReadOnly()) { onPageReadOnly(layoutDdnsOfflineBinding.getRoot()); } else { gotoDeviceListPage(); } }); if (mViewModel.isDDNSReadOnly()) { layoutDdnsOfflineBinding.managerTipLayout.tipTextTv.setGravity(Gravity.CENTER); layoutDdnsOfflineBinding.managerTipLayout.getRoot().setVisibility(View.VISIBLE); } }); mViewBinding.ddnsApChanged.setOnInflateListener((viewStub, view) -> { layoutDdnsApChangedBinding = LayoutDdnsApChangedBinding.bind(view); layoutDdnsApChangedBinding.ddnsBlankViewApChanged.setBlankActionClickListener(v -> { if (mViewModel.isDDNSReadOnly()) { onPageReadOnly(layoutDdnsApChangedBinding.getRoot()); } else { DataTracker.getInstance().trackEvent(GATrackerDefine.Category.CATEGORY_BUTTON_CLICKS, GATrackerDefine.Action.ACTION_ADVANCED_DDNS, GATrackerDefine.Label.LABEL_ADVANCED_DDNS_CHANGE_DOMAIN_NAME); DDNSEditFragment ddnsEditFragment = DDNSEditFragment.newInstance(true); ddnsEditFragment.show(getChildFragmentManager(), DDNSEditFragment.class.getName()); } }); if (mViewModel.isDDNSReadOnly()) { layoutDdnsApChangedBinding.managerTipLayout.tipTextTv.setGravity(Gravity.CENTER); layoutDdnsApChangedBinding.managerTipLayout.getRoot().setVisibility(View.VISIBLE); } }); mViewBinding.ddnsSwitchWrap.setActionCheckedChangeListener((buttonView, isChecked, fromUser) -> { if (fromUser) { if (mViewModel.isDDNSReadOnly()) { mViewBinding.ddnsSwitchWrap.setActionChecked(!isChecked); onPageReadOnly(mViewBinding.getRoot()); return; } else { mViewBinding.ddnsDomainCard.setVisibility(isChecked ? View.VISIBLE : View.GONE); mViewBinding.ddnsApChangedNote.setVisibility(isChecked ? View.VISIBLE : View.GONE); } } if (isChecked) { DataTracker.getInstance().trackEvent(GATrackerDefine.Category.CATEGORY_BUTTON_CLICKS, GATrackerDefine.Action.ACTION_ADVANCED_DDNS, GATrackerDefine.Label.LABEL_ADVANCED_DDNS_ENABLE); } else { DataTracker.getInstance().trackEvent(GATrackerDefine.Category.CATEGORY_BUTTON_CLICKS, GATrackerDefine.Action.ACTION_ADVANCED_DDNS, GATrackerDefine.Label.LABEL_ADVANCED_DDNS_DISABLE); } if (!mIsOperatingDDNS) { mViewModel.setDDNSSetting(isChecked, mViewBinding.ddnsDomain.getContent().getText().toString()); } }); mViewBinding.ddnsChangeDomainName.setOnClickListener(v -> { if (mViewModel.isDDNSReadOnly()) { onPageReadOnly(mViewBinding.getRoot()); } else { new DDNSEditFragment().show(getChildFragmentManager(), DDNSEditFragment.class.getName()); } }); } private void subscribeToViewModel() { mViewModel.getDDNSSettingData().observe(getViewLifecycleOwner(), this::showDDNSSettings); mViewModel.getDDNSLoadEvent().observe(getViewLifecycleOwner(), this::showDDNSLoadResult); mViewModel.getDDNSUpdateEvent().observe(getViewLifecycleOwner(), this::showDDNSUpdateResult); } private void showDDNSSettings(Resource<DDNSSettingBean> settingBeanResource) { DDNSSettingBean settingBean; if (settingBeanResource == null || settingBeanResource.getData() == null) { settingBean = new DDNSSettingBean(); } else { settingBean = settingBeanResource.getData(); } mIsOperatingDDNS = true; TPToastDialog.dismiss(); if (!mViewModel.isCurrentNetworkOnline()) { showDDNSOfflinePage(); } else if (settingBean != null) { if (!settingBean.isDdnsEnable()) { showDDNSTipPage(); } else if (!settingBean.isApChanged()) { if (settingBean.getDDNSInfo() != null) { showDDNSSettingPage(settingBean.getDDNSInfo().isDdnsStatus(), settingBean.getDDNSInfo().getDomainName()); } else { showDDNSSettingPage(false, null); } } else { showDDNSChangedPage(); } } mIsOperatingDDNS = false; } private void showDDNSSettingPage(boolean statusEnable, String domainName) { if (layoutDdnsRegisterBinding != null) { layoutDdnsRegisterBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsOfflineBinding != null) { layoutDdnsOfflineBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsApChangedBinding != null) { layoutDdnsApChangedBinding.getRoot().setVisibility(View.GONE); } if (mViewModel.isDDNSReadOnly()) { mViewBinding.managerTipLayout.getRoot().setVisibility(View.VISIBLE); } mViewBinding.ddnsSwitchWrap.setEnabled(true); mViewBinding.ddnsSwitchCard.setVisibility(View.VISIBLE); mViewBinding.ddnsSwitchTip.setText(getDdnsRegisterText()); mViewBinding.ddnsSwitchTip.setMovementMethod(SpannableStringInstance.getInstance().getLinkMovementMethod()); mViewBinding.ddnsSwitchTip.setVisibility(View.VISIBLE); mViewBinding.ddnsDomain.setContentText(domainName); mViewBinding.ddnsSwitchWrap.setActionChecked(statusEnable); mViewBinding.ddnsDomainCard.setVisibility(statusEnable ? View.VISIBLE : View.GONE); mViewBinding.ddnsApChangedNote.setVisibility(statusEnable ? View.VISIBLE : View.GONE); } private void showDDNSTipPage() { if (mIsChangeFromUser) { return; } mViewBinding.ddnsSwitchCard.setVisibility(View.GONE); mViewBinding.ddnsSwitchTip.setVisibility(View.GONE); mViewBinding.ddnsDomainCard.setVisibility(View.GONE); mViewBinding.ddnsApChangedNote.setVisibility(View.GONE); if (layoutDdnsOfflineBinding != null) { layoutDdnsOfflineBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsApChangedBinding != null) { layoutDdnsApChangedBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsRegisterBinding == null) { ViewStub noDDNSViewStub = mViewBinding.getRoot().findViewById(R.id.ddns_list_empty); noDDNSViewStub.inflate(); } layoutDdnsRegisterBinding.getRoot().setVisibility(View.VISIBLE); } private void showDDNSOfflinePage() { mViewBinding.ddnsSwitchCard.setVisibility(View.GONE); mViewBinding.ddnsSwitchTip.setVisibility(View.GONE); mViewBinding.ddnsDomainCard.setVisibility(View.GONE); mViewBinding.ddnsApChangedNote.setVisibility(View.GONE); if (layoutDdnsRegisterBinding != null) { layoutDdnsRegisterBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsApChangedBinding != null) { layoutDdnsApChangedBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsOfflineBinding == null) { ViewStub offlineViewStub = mViewBinding.getRoot().findViewById(R.id.ddns_list_offline); offlineViewStub.inflate(); } layoutDdnsOfflineBinding.getRoot().setVisibility(View.VISIBLE); } private void showDDNSChangedPage() { mViewBinding.ddnsSwitchCard.setVisibility(View.VISIBLE); mViewBinding.ddnsSwitchTip.setVisibility(View.VISIBLE); mViewBinding.ddnsSwitchWrap.setActionChecked(false); mViewBinding.ddnsSwitchWrap.setEnabled(false); mViewBinding.ddnsDomainCard.setVisibility(View.GONE); mViewBinding.ddnsApChangedNote.setVisibility(View.GONE); if (layoutDdnsOfflineBinding != null) { layoutDdnsOfflineBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsRegisterBinding != null) { layoutDdnsRegisterBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsApChangedBinding == null) { ViewStub disableViewStub = mViewBinding.getRoot().findViewById(R.id.ddns_ap_changed); disableViewStub.inflate(); } layoutDdnsApChangedBinding.getRoot().setVisibility(View.VISIBLE); } private void showLoadingWheel() { mIsOperatingDDNS = true; mViewBinding.ddnsSwitchCard.setVisibility(View.GONE); mViewBinding.ddnsSwitchTip.setVisibility(View.GONE); mViewBinding.ddnsDomainCard.setVisibility(View.GONE); mViewBinding.ddnsApChangedNote.setVisibility(View.GONE); if (layoutDdnsOfflineBinding != null) { layoutDdnsOfflineBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsRegisterBinding != null) { layoutDdnsRegisterBinding.getRoot().setVisibility(View.GONE); } if (layoutDdnsApChangedBinding != null) { layoutDdnsApChangedBinding.getRoot().setVisibility(View.GONE); } TPToastDialog.showLoading(requireContext(), null, null); } private void showDDNSLoadResult(Boolean success) { if (success == null) { showLoadingWheel(); } else { TPToastDialog.dismiss(); if (!success) { showDDNSOfflinePage(); } mIsOperatingDDNS = false; } } private void showDDNSUpdateResult(Boolean success) { if (success == null) { mViewBinding.ddnsSwitchWrap.getActionSwitch().setStateLoading(true); mIsOperatingDDNS = true; } else { mViewBinding.ddnsSwitchWrap.getActionSwitch().setStateLoading(false); if (success) { mViewBinding.ddnsDomain.setClickable(mViewBinding.ddnsSwitchWrap.isActionChecked()); } else { mViewBinding.ddnsSwitchWrap.getActionSwitch().toggle(); } mIsOperatingDDNS = false; } mViewBinding.ddnsSwitchWrap.getActionSwitch().setClickable(false); } private void gotoDeviceListPage() { DataTracker.getInstance().trackEvent(GATrackerDefine.Category.CATEGORY_BUTTON_CLICKS, GATrackerDefine.Action .ACTION_ADVANCED_DDNS, GATrackerDefine.Label.LABEL_ADVANCED_DDNS_CHECK_INTERNET); Intent intent = new Intent(requireContext(), DeviceDetailActivity.class); intent.putExtra(DeviceDetailActivity.DEVICE_ID, mViewModel.getMasterDeviceId()); startActivity(intent); } private SpannableString getDdnsRegisterText() { return SpannableStringInstance.getInstance().generateSpannableFontText(requireActivity(), R.string.ddns_enable_tips_v2 , getString(R.string.ddns_enable_learn_more) , true , UIUtils.getColorTextSpanLink(requireActivity()) , UIUtils.getColorTextSpanLinkVariant(requireActivity()) , view -> { Intent i = new Intent(requireActivity(), CommonWebActivity.class); i.putExtra(CommonWebActivity.EXTRA_URL, BuildConfig.DDNS_FAQ_URL); startActivity(i); }); } }
11-27
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值