当前位置: 首页 > news >正文

安卓开发之动态设置网络访问地址

之前开发程序联测测接口的时候,因为要和不同的后台人员调接口,所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址,之后编译运行一下,才能测试。但要是换了个后台人员,或者同时和2个后台人员测接口,又要再修改ip后重新编译,重新运行,很繁琐,包括后期测试也是一样。

测试人员总是问我能不能弄个功能,可以让他们在dat环境下测完一个功能后,可以在应用里手动切换网络地址,继续测uat网络环境下此功能是否正常,之前忙着别的事儿,而且对这个功能也没什么头绪,就一直没弄。最近时间闲下来了,而且关于这个功能,我也有了一些自己的见解,所以在此把这个功能展示一下,嘿嘿。

多余的话就不说了,直接上图~

核心原理:这个输入框里可以随时设置网络地址和端口号(如果不需要输入端口号,直接空着就行),设置的网址会在点击保存按钮后直接替换app里面通用的网络地址前缀,同时将数据存入SharedPreferences中,每次启动app时,都会从Application中先检查SharedPreferences中是否存在保存的数据,如果有存储的数据,就将通用url修改成存储的url,达到这次保存,下次就不用修改了的功能。

下面开始直接贴代码

1.MainActivity.java

 public class MainActivity extends AppCompatActivity {private TextView tv_url_ma, tv_changeurl_ma, tv_refresh_ma;private WebView wv_showurl_ma;private static final int INTERNETCODE = 001;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();//代码初始化tv_url_ma.setText(PublicInfo.appurl);setClick();//设置点击方法checkPermissions();//检查用户是否给予网络权限,如果没有,就不启用initwv();//webview设置}/*8检查用户是否给予网络权限*/private void checkPermissions() {if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {//用户没有进行网络授权ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.INTERNET}, INTERNETCODE);return;} else {//已经获取到网络权限,可以显示默认网址中的数据wv_showurl_ma.loadUrl(PublicInfo.appurl);//设置网络地址}}/*** 用户权限返回结果** @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case INTERNETCODE://网络权限的返回值
//if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//证明得到了用户授权checkPermissions();//再次调用检查权限的方法,如果没问题,就会启动网络请求} else {Toast.makeText(MainActivity.this, "当前设备未获取网络权限,无法联网", Toast.LENGTH_SHORT).show();}break;default:break;}}/*** webView设置*/private void initwv() {wv_showurl_ma.getSettings().setJavaScriptEnabled(true);//如果网页中使用js,不加这行代码不显示wv_showurl_ma.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {
//                return super.shouldOverrideUrlLoading(view, url);view.loadUrl(url);return true;//返回值为true时在WebView中打开,为false时调用浏览器打开}});}/*** 设置点击方法*/private void setClick() {tv_changeurl_ma.setOnClickListener(new MainActivityClicm());tv_refresh_ma.setOnClickListener(new MainActivityClicm());}/*** 代码初始化*/private void init() {tv_url_ma = findViewById(R.id.tv_url_ma);//url地址展示tv_changeurl_ma = findViewById(R.id.tv_changeurl_ma);//修改url地址按钮tv_refresh_ma = findViewById(R.id.tv_refresh_ma);//刷新页面按钮wv_showurl_ma = findViewById(R.id.wv_showurl_ma);//展示当前url所对应的网站详情}/*** 设置本页的点击方法*/private class MainActivityClicm implements View.OnClickListener {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_changeurl_ma://修改url地址
//                    Toast.makeText(MainActivity.this,"修改url地址",Toast.LENGTH_SHORT).show();DialogUtils dialogUtils = new DialogUtils(MainActivity.this);if (!dialogUtils.isShow()) {//判断弹出框是否已经打开了,如果没打开过,才运行打开代码dialogUtils.showDialog("这里输入弹出框的展示标题");}break;case R.id.tv_refresh_ma://刷新页面Toast.makeText(MainActivity.this, "刷新页面", Toast.LENGTH_SHORT).show();wv_showurl_ma.loadUrl(PublicInfo.appurl);//设置网络地址tv_url_ma.setText(PublicInfo.appurl);//展示当前的网络地址break;default:break;}}}
}

2.DialogUtils.java

 /*** 这个类里设置弹出框的数据*/
public class DialogUtils extends Dialog {private Context context;private Dialog dialog;private SharedPreferences mSharedPreferences;private TextView tv_iptitle_udg, tv_title_udg, tv_nowurl_udg;private Spinner sp_checkurl_udg;private AppCompatEditText et_ipurl_udg, et_port_udg;private AppCompatButton btn_ok_udg, btn_cancel_udg;private ArrayAdapter<String> arrayAdapter;//下面这三个参数,可以放到项目values下的string中,这里为了看着方便就直接写这里了private static final String url_dat = "测试环境DAT";private static final String url_uat = "测试环境UAT";private static final String url_pre = "测试环境准生产";//为SharedPreferences设置一些必要的参数public static final String URLSETTINGINFO = "URLSETTINGINFO";public static final String URLSETTINGIP = "URLSETTINGIP";public static final String URLSETTINGPORT = "URLSETTINGPROT";private SharedPreferences sharedPreferences;public DialogUtils(@NonNull Context context) {super(context);this.context = context;//拿到上下文sharedPreferences = context.getSharedPreferences(URLSETTINGINFO, Context.MODE_PRIVATE);}/*** 显示dialog窗口的方法*/public void showDialog(String title) {dialog = new Dialog(context);dialog.setCancelable(false);dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);dialog.setContentView(R.layout.utils_dialog);final Window window = dialog.getWindow();window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//设置背景透明initView(dialog);//设置dialog的参数tv_title_udg.setText(title);//设置标题tv_nowurl_udg.setText("当前url地址为:" + PublicInfo.appurl);//设置当前url地址tv_iptitle_udg.setText("ip地址" + PublicInfo.urltitle);initSpinner();//设置spinner参数setClick();//设置点击方法dialog.show();}/*** 设置点击方法*/private void setClick() {btn_ok_udg.setOnClickListener(new DUtilsClick());btn_cancel_udg.setOnClickListener(new DUtilsClick());}/*** 设置spinner参数*/private void initSpinner() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add(url_dat);arrayList.add(url_uat);arrayList.add(url_pre);//设置适配器arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, arrayList);arrayAdapter.setDropDownViewResource(R.layout.spinner_layout);//这个是设置自定义view时使用的方法,如果使用默认就可以的话,可以不用写这行代码sp_checkurl_udg.setAdapter(arrayAdapter);sp_checkurl_udg.setOnItemSelectedListener(new DUtilsSpinnerClick());}/*** 设置dialog中的参数** @param dialog*/private void initView(Dialog dialog) {tv_title_udg = dialog.findViewById(R.id.tv_title_udg);//标题栏tv_nowurl_udg = dialog.findViewById(R.id.tv_nowurl_udg);//显示当前url地址sp_checkurl_udg = dialog.findViewById(R.id.sp_checkurl_udg);//可以设置默认地址的下拉框tv_iptitle_udg = dialog.findViewById(R.id.tv_iptitle_udg);//ip地址段的标题,用来显示当前的请求头是hppt还是httpset_ipurl_udg = dialog.findViewById(R.id.et_ipurl_udg);//ip地址et_port_udg = dialog.findViewById(R.id.et_port_udg);//端口号btn_ok_udg = dialog.findViewById(R.id.btn_ok_udg);//确认按钮btn_cancel_udg = dialog.findViewById(R.id.btn_cancel_udg);//取消按钮}/*** 设置spinner的点击方法*/private class DUtilsSpinnerClick implements AdapterView.OnItemSelectedListener {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {String itemname = arrayAdapter.getItem(position);switch (itemname) {case url_dat://选择dat标签setInfo(PublicInfo.rul_dat);//根据选择不同的标签,为输入框中赋予不同的网络地址break;case url_uat://选择uat标签setInfo(PublicInfo.rul_uat);//根据选择不同的标签,为输入框中赋予不同的网络地址break;case url_pre://选择pro标签setInfo(PublicInfo.rul_pro);//根据选择不同的标签,为输入框中赋予不同的网络地址break;default:break;}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {Toast.makeText(context, "没有选择任何数据", Toast.LENGTH_SHORT).show();}}/*** 设置弹出框的点击方法*/private class DUtilsClick implements View.OnClickListener {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_ok_udg://确定按钮btn_ok_udg.setClickable(false);//先关闭点击功能,防止用户重复点击saveUrlInfo(et_ipurl_udg.getText().toString().trim(), et_port_udg.getText().toString().trim());//保存用户选择的url地址值setLocalInfo(et_ipurl_udg.getText().toString().trim(), et_port_udg.getText().toString().trim());//将默认的url地址替换为用户修改的urlToast.makeText(context, "IP地址修改成功", Toast.LENGTH_SHORT).show();dissmissDialog();//修改完成后关闭弹窗
//                    android.os.Process.killProcess(android.os.Process.myPid());//IP地址修改成功后关闭程序,再次开启时启用新的IP地址(代码可用可不用,根据实际情况来决定)break;case R.id.btn_cancel_udg://取消按钮dissmissDialog();//关闭弹出框break;default:break;}}/*** 将默认的url地址替换为用户修改的url*/private void setLocalInfo(String ip, String port) {if (TextUtils.isEmpty(port)) {PublicInfo.appurl = PublicInfo.urltitle + ip;} else {PublicInfo.appurl = PublicInfo.urltitle + ip + ":" + port;}}}/*** 设置用户选择的url地址值*/private void saveUrlInfo(String ip, String port) {SharedPreferences.Editor editor = sharedPreferences.edit();editor.putString(URLSETTINGIP, ip);editor.putString(URLSETTINGPORT, port);editor.commit();}/*** 设置对应的网络地址*/private void setInfo(String baseUrl) {String[] url = baseUrl.split("\\:");et_ipurl_udg.setText(url[0]);et_port_udg.setText(url[1]);}/*** 判断dialog是否显示** @return*/public boolean isShow() {if (null != dialog) {return dialog.isShowing();}return false;}/*** 关闭弹出框*/public void dissmissDialog() {if (null != dialog) {dialog.dismiss();}}
}

3.MyApplication.java

/*** 调用SharedPreferences时需要这个文件*/
public class MyApplication extends Application {private SharedPreferences sharedPreferences;public static MyApplication application;@Overridepublic void onCreate() {super.onCreate();application = this;initBaseUrl();//设置默认的url地址值}/*** 设置默认的url地址值*/private void initBaseUrl() {sharedPreferences = getSharedPreferences(DialogUtils.URLSETTINGINFO, Context.MODE_PRIVATE);String localip = "";String localport = "";try {String[] port = PublicInfo.baseurl.split("\\:");localip = sharedPreferences.getString(DialogUtils.URLSETTINGIP, port[0]);localport = sharedPreferences.getString(DialogUtils.URLSETTINGPORT, port[1]);if(TextUtils.isEmpty(localport)){//如果前一次端口号存储为空,就不在网址后面追加端口号。PublicInfo.appurl = PublicInfo.urltitle + localip;//将本地存储的URL地址设置为程序中默认的网络请求地址。}else{PublicInfo.appurl = PublicInfo.urltitle + localip + ":" + localport;//将本地存储的URL地址设置为程序中默认的网络请求地址。}} catch (Exception e) {e.printStackTrace();}}
}

4.PublicInfo.java

/*** 这个类里存储需要调用的地址*/
public class PublicInfo {public static String urltitle = "https://";public static String rul_dat = "www.baidu.com:80";public static String rul_uat = "www.zhihu.com:80";public static String rul_pro = "www.sina.com:80";public static String basetitle=urltitle;//设置默认的请求头(http或者https)public static String baseurl=rul_dat;//设置默认地址(dat,uat或者其他的)public static String appurl=basetitle+baseurl;//这里设置app的默认网络请求地址}

5.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="登录界面" /><TextViewandroid:id="@+id/tv_url_ma"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="20dp"android:text="当前网络地址" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"><TextViewandroid:id="@+id/tv_changeurl_ma"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:background="#00ff00"android:layout_marginLeft="30dp"android:text="修改地址" /><TextViewandroid:id="@+id/tv_refresh_ma"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:background="#ff0000"android:layout_alignParentRight="true"android:layout_marginRight="30dp"android:text="刷新页面" /></RelativeLayout><WebViewandroid:id="@+id/wv_showurl_ma"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

6.spinner_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="spinner里面每个选项的布局"android:gravity="center"android:padding="10dp"></TextView>

7.utils_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="340dp"android:layout_height="wrap_content"android:layout_gravity="center"android:background="#ffffff"android:orientation="vertical"><TextViewandroid:id="@+id/tv_title_udg"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="10dp"android:text="标题栏"android:textSize="20sp" /><TextViewandroid:id="@+id/tv_nowurl_udg"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="10dp"android:text="当前的url地址:" /><Spinnerandroid:id="@+id/sp_checkurl_udg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="10dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:layout_weight="3"><TextViewandroid:id="@+id/tv_iptitle_udg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="ip地址:"/><androidx.appcompat.widget.AppCompatEditTextandroid:id="@+id/et_ipurl_udg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="ip地址" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:layout_weight="1"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="端口号:"/><androidx.appcompat.widget.AppCompatEditTextandroid:id="@+id/et_port_udg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:hint="端口号" /></LinearLayout></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/btn_ok_udg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确定" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/btn_cancel_udg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="取消" /></RelativeLayout></LinearLayout>

8.AndroidManifest.xml(这个很重要,一个是添加了网路权限,另一个是将app默认的Application设置为上面自己设置的MyApplication,这个是很重要的,别偷懒啊)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.loginactivity"><!--    设置用户网络权限--><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:name=".MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

相关文章:

安卓开发之动态设置网络访问地址

之前开发程序联测测接口的时候&#xff0c;因为要和不同的后台人员调接口&#xff0c;所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址&#xff0c;之后编译运行一下&#xff0c;才能测试。但要是换了个后台人员&#xff0c;或者同时和2个后台人员测接口…...

深度学习模型训练工作汇报(3.8)

进行数据的初始整理的准备 主要是进行伪序列字典的设置&#xff0c;以及训练数据集的准备。 期间需要的一些问题包括在读取文件信息的时候&#xff0c;需要跳过文件的第一行或者前两行&#xff0c;如果使用循环判断的话&#xff0c;会多进行n次的运算&#xff0c;这是不划算的…...

【ns-3】添加nr(5G-LENA)模块

文章目录前言1. 下载5G-LENA源代码2. 配置并重新构建ns-3项目参考文献前言 本篇以ns-3.37为例介绍如何在ns-3中添加nr&#xff08;5G-LENA&#xff09;模块 [1]。5G-LENA是一个由Mobile Networks group CTTC&#xff08;Centre Tecnolgic de Telecomunicacions de Catalunya&a…...

(枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组

目录 题目链接 一些话 流程 套路 ac代码 题目链接 1236. 递增三元组 - AcWing题库 一些话 int f[N]; memset(f,0,sizeof f)影响不到f[N] 所以尽量不要对f[N]赋值&#xff0c;不要用f[N]操作 流程 //由三重暴力i,j,k因为三重暴力底下是分别用i和j&#xff0c;j和k作比较…...

mysql五种索引类型(实操版本)

为什么使用索引 最近学习了Mysql的索引&#xff0c;索引对于Mysql的高效运行是非常重要的&#xff0c;正确的使用索引可以大大的提高MySql的检索速度。通过索引可以大大的提升查询的速度。不过也会带来一些问题。比如会降低更新表的速度&#xff08;因为不但要把保存数据还要保…...

微服务进阶之 SpringCloud Alibaba

文章目录微服务进阶&#x1f353;SpringCloud 有何劣势&#xff1f;&#x1f353;SpringCloud Alibaba 提供了什么&#xff1f;提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud 系列学习将会持续更新 微服务进阶 &#x1f353;SpringCloud 有何劣势&#xff1…...

前端性能优化笔记2 第二章 度量

相关 Performance API 都在 window.performance 对象下 performance.now() 方法 精度精确到微妙获取的是把页面打开时间点作为基点的相对时间&#xff0c;不依赖操作系统的时间。 部分浏览器不支持 performance.now() 方法&#xff0c;可以用 Date.now() 模拟 performance.n…...

关于new和delete的一些思考,为什么不能在析构函数中调用delete释放对象的内存空间,new和delete的原理

最近在写代码的时候&#xff0c;觉得每次new出来的对象都需要去delete好麻烦&#xff0c;于是直接把delete写到了析构函数中&#xff0c;在析构函数里面写了句delete this&#xff0c;结果调用析构函数的时候死循环了&#xff0c;不是很理解原因&#xff0c;于是去研究了一下。…...

一场以数字技术深度影响和改造传统实业的新风口,正在开启

当数字经济的浪潮开始上演&#xff0c;一场以数字技术深度影响和改造传统实业的新风口&#xff0c;正在开启。对于诸多在互联网时代看似业已走入死胡同的物种来讲&#xff0c;可以说是打开了新的天窗。对于金融科技来讲&#xff0c;同样如此。以往&#xff0c;谈及金融科技&…...

【LeetCode】13. 罗马数字转整数

题目链接&#xff1a;https://leetcode.cn/problems/roman-to-integer/ &#x1f4d5;题目要求&#xff1a; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即…...

2023/3/8集合之TreeSet HashSet简介 不含代码

TreeSet : 底层是由TreeMap维护的 无序的,不可重的 底层结构 : 红黑树(平衡二叉树) 特点 : 查询效率高,默认升序排序引用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景新增方法:新增了一些与比较大小相关的方法 遍历方式 1)foreach 2)iterator 1测试…...

【面试1v1实景模拟】面试中常见的Java关键字详解

笑小枫专属目录老面&#x1f474;&#xff1a;Java中有哪些关键字老面&#x1f474;&#xff1a;简单介绍一下 final 关键字老面&#x1f474;&#xff1a;简单介绍一下 this、super 关键字老面&#x1f474;&#xff1a;简单介绍一下 static 关键字老面&#x1f474;&#xff…...

MySQL8.0.16存储过程比5.7.22性能大幅下降

MySQL8.0.16存储过程比5.7.22性能大幅下降 1、背景 从5.7.22迁移数据库到8.0.16&#xff0c;发现存储过程执行性能大幅下降。原来在5版本上执行只需要3-5秒&#xff0c;到8版本上居然要达到上万秒。 5版本&#xff1a; call Calculation_Week() OK 时间: 3.122s 8版本&#x…...

基于MATLAB的无线信道的传播与衰落(附完整代码与分析)

目录 一. 一般路径损耗模型 1. 1自由环境下路径损耗 1. 2 考虑实际情况 1.3 考虑阴影衰落 二. 代码仿真与理解 &#xff08;1&#xff09;函数文件 &#xff08;2&#xff09;函数文件 &#xff08;3&#xff09;主运行文件 三. 运行结果及理解 3.1 3.2 3.3 一. …...

SDX62如何查看Kernel版本和Operating System Version Patch Level

Kernel版本号方法一&#xff1a;adb shell登录&#xff0c;然后执行uname -a# uname -aLinux sdxlemur 5.4.180-perf #1 PREEMPT Fri Mar 3 04:24:42 UTC 2023 armv7l GNU/Linux方法二&#xff1a;内核源码查看&#xff0c;apps_proc/src/kernel/msm-5.4/Makefile 文件&#xf…...

001+limou+HTML——(1)HTML入门知识

000、本人编写前言 前言&#xff1a;本笔记来源于莫振杰的书《HTML、CSS、Javascript从零到一快速上手》&#xff0c;经过修改制成的自学笔记&#xff0c;本书很适合小白学习入门web的相关知识&#xff0c;你也可以先看看我从中学到了什么&#xff0c;再考虑是否去认真学习这本…...

使用Arduino Uno构建一个巡线机器人

使用Arduino Uno构建一个巡线机器人 原文 MX 巡线机器人&#xff08;**LFR&#xff09;**是一种简单的自主引导机器人&#xff0c;它遵循在地面上绘制的线来检测白色表面上的暗线或黑暗表面上的白线。在本教程中&#xff0c;使用 Arduino Uno 和一些易于访问的组件构建黑线跟…...

【C++】类和对象(收尾)

文章目录成员变量初始化问题初始化列表explicit关键字static成员特性&#xff1a;友元友元函数友元类内部类特性匿名对象成员变量初始化问题 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给了对象中各个成员变量一个合适的初始值。但是这并不能够称为对对象中成…...

Linux延迟操作

一、软中断Linux内核中定义了如下几种软中断&#xff1a;enum {HI_SOFTIRQ0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ, /* Preferable RCU should always be the last soft…...

np.insert()函数用法

目录insert()函数定义程序举例说明行插入列插入多数值行插入完整的程序和显示结果&#xff1a;insert()函数定义 insert(arr, obj, values, axisNone) 参数说明&#xff1a; arr : 需要插入的数组&#xff0c;即Input array&#xff1b; obj&#xff1a;向数组中插入值的位置…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...