首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

iOS开发-UITextView根据内容自适应高度

UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: 1 2 3 4 5 6 7 8 9 10 11 12 -(UITextView *)textView{ if (!_textView) { //http://www.cnblogs.com/xiaofeixiang/ _textView=[[UITextView alloc]initWithFrame:CGRectMake(30, 200, CGRectGetWidth([[UIScreen mainScreen] bounds])-60, 30)]; [_textView setTextColor:[UIColor redColor]]; [_textView.layer setBorderColor:[[UIColor blackColor] CGColor]]; [_textView setFont:[UIFont systemFontOfSize:15]]; [_textView.layer setBorderWidth:1.0f]; [_textView setDelegate:self]; } return _textView; } 实现textViewDidChange方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -( void )textViewDidChange:(UITextView *)textView{ //博客园-FlyElephant static CGFloat maxHeight =60.0f; CGRect frame = textView.frame; CGSize constraintSize = CGSizeMake(frame.size.width, MAXFLOAT); CGSize size = [textView sizeThatFits:constraintSize]; if (size.height<=frame.size.height) { size.height=frame.size.height; } else { if (size.height >= maxHeight) { size.height = maxHeight; textView.scrollEnabled = YES; // 允许滚动 } else { textView.scrollEnabled = NO; // 不允许滚动 } } textView.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, size.height); } 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5148380.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发调试工具ADB的使用

ADB(Android Debug Bridge)是Android SDK中的一个工具, 使用ADB可以直接操作管理Android模拟器或者真实的Andriod设备。 ADB主要功能有: 1.在Android设备上运行Shell(命令行) 2.管理模拟器或设备的端口映射 3.在计算机和设备之间上传/下载文件 4.将电脑上的本地APK软件安装至Android模拟器或设备上 1、在使用ADB之前首先看看你的Eclipse中是否已经安装了Android SDK工具包,如下图: 这个USB 驱动也是需要的,用来连接你的Android设备。 ADB是一个客户端-服务器端程序, 其中客户端是你用来操作的电脑, 服务器端是android设备。 2、如果你已经安装了Android SDK 那么你可以在你的SDK目录下找到..\android-sdk-windows\platform-tools 这个目录,ADB工具就放在这里。如图: 复制这个目录的路径,我们需要在windows的系统设置中将这个路径设置到PATH中,设置完成后我们就可以再CMD窗口中使用ADB了。 3、我们现启动,我们的andriod虚拟机,然后进入CMD窗口。 这里的emulator-5554就是我的虚拟机设备 4、常用的ADB命令 a) adb install <apk文件路径> 这个命令将指定的apk文件安装到设备上 b) adb uninstall <软件名> adb uninstall -k <软件名> 如果加 -k 参数,为卸载软件但是保留配置和缓存文件. c)adb shell 这个命令将登录设备的shell adb shell <command命令> 后面加<command命令>将是直接运行设备命令, 相当于执行远程命令 d)adb help 这个命令将显示帮助信息 c)adb push <本地路径> <远程路径> 从电脑上发送文件到设备 adb remount 在执行push命令之前我们还需要使用remount命令获取上传文件权限,否则会出现 Read-only file system 的错误提示信息 示例如下图 这里要注意的就是如果你需要向一个二级目录里放文件的时候,一定使用"/"而不能使用"\",原因是android是liunx下的系统,而我们用的是windows。比如:sdcard/aa这样就好啦,否则会提示找不到或者权限不够。 d)adb get-product 获取设备的ID e)adb get-serialno 获取设备的序列号 f)adb devices 获取当前运行的模拟器/设备的实例的列表及每个实例的状态 g) adb bugreport 查看bug报告 5、常用的ADB Shell命令 通过adb shell命令进入shell a)访问数据库 sqlite3 b)记录无线通讯日志 一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录: logcat-bradio c)删除应用 Android没有提供一个卸载应用的命令,需要自己手动删除: cd/data/app rm 应用名称.apk d)查看目录 ls e)打印或设置当前系统时间 date f)查看内存信息 cat/proc/meminfo g)查看CPU信息 cat/proc/cpuinfo 6、删除Android系统Rom自带的软件 a.确定手机root了,取得了root权限才能删除系统文件呀. b.下载Android_db.rar,解压到%windir/%System32下. c.手机连接数据线,在电脑上打开cmd,然后输入命令 adbremount adbshell su 执行完成之后,你会看到: * daemon not running. starting it now * * daemon started successfully * d.接着就是Linux命令行模式了,输入 cdsystem/app 你会发现没啥变化,然后输入ls回车. 这时候列表显示了system/app里面的所有文件,也就是Rom集成的一些软件了. e.开始删除吧!比如删除Youtube,他的文件名是Youtube.odex和Youtube.apk 我们要删除这2个文件,敲入以下命令: rmYoutube.* 重启,Youtube已经删除掉了,注意各位同学千万不要删除你不知道是啥的东西。 7、sqlite3 adb命令 进入数据库的两种方式 第一种:sqlite3 数据库名称.xx 第二种:adb shell sqlite3 .databases 列出数据库文件名 .tables ?PATTERN? 列出?PATTERN?匹配的表名 .import FILE TABLE 将文件中的数据导入的文件 .dump ?TABLE? 生成形成数据库表的SQL脚本 .output stdout 将输出打印到屏幕 .mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl… .nullvalue STRING 用指定的串代替输出的NULL串 .read FILENAME 执行指定文件中的SQL语句 .schema ?TABLE? 打印创建数据库表的SQL语句 .separator STRING 用指定的字符串代替字段分隔符 .show 打印所有SQLite环境变量的设置 .quit 退出命令行接口 本文作者:佚名 来源:51CTO

优秀的个人博客,低调大师

Android开发一 什么是3G

3G,全称为3rd Generation,中文含义就是指第三代数字通信。 所谓3G,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。 3G只是一种通信技术标准,符合这个标准的技术有WCDMA、CDMA2000、TD-SCDMA三种制式。中国联通使用的是WCDMA(世界上大部分3G网络都采用的是该标准) ;中国电信使用的是CDMA2000 (日、韩和北美使用);中国移动使用的是具有自主知识产权的TD-SCDMA(只有中国才使用) 。相对第一代模拟制式手机(1G)和第二代GSM、CDMA等数字手机(2G),3G网络能处理图像、音乐、视频等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。第三代与前两代的主要区别是在传输声音和数据的速度上有很大的提升。 由于3G商用需要相当浩大的工程,要从目前的2G迈向3G不可能一下就衔接得上,因此前几年2.5G的手机就出现了。符合2.5G标准的技术有CDMA2000 1X和GPRS,中国联通使用的是CDMA2000 1X标准,中国移动使用的是GPRS标准。目前,我们可以把2.5G移动通信技术看作是2G迈向3G的衔接性技术,在2.5G网络下出现了如WAP、蓝牙(Bluetoot) 等技术。 智能手机软件平台有: Symbian, Windows Mobile, RIM BlackBerry, Android, iPhone, Palm, Brew, Java/J2ME。 2009年市场份额: Symbian 51% RIM BlackBerry 18% iPhone 13.3 windows Mobile 9.3% linux 4.6% Android 1.8% 本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2012/03/31/2427604.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

高质量 Android 开发框架 LoonAndroid 详解

整个框架式不同于androidannotations,Roboguice等ioc框架,这是一个类似spring的实现方式。在整应用的生命周期中找到切入点,然后对activity的生命周期进行拦截,然后插入自己的功能。 框架的说明 如果你想看ui方面的东西,这里没有,想要看牛逼的效果这里也没有。这只是纯实现功能的框架,它的目标是节省代码量,降低耦合,让代码层次看起来更 清晰。整个框架一部分是网上的,一部分是我改的,为了适应我的编码习惯,还有一部分像orm完全是网上的组件。在此感谢那些朋友们。整个框架式的初衷是为 了偷懒,之前都是一个功能一个jar,做项目的时候拉进去,这样对于我来说依然还是比较麻烦。最后就导致我把所有的jar做成了一个工具集合包。有很多框 架都含有这个工具集合里的功能,这些不一定都好用,因为这是根据我个人使用喜欢来实现的,如果你们有自己的想法,可以自己把架包解压了以后,源码拉出来改 动下。目前很多框架都用到了注解,除了androidannotations没有入侵我们应用的代码以外,其他的基本上都有,要么是必须继承框架里面的 activity,要么是必须在activity的oncreat里面调用某个方法。整个框架式不同于 androidannotations,Roboguice等ioc框架,这是一个类似spring的实现方式。在整应用的生命周期中找到切入点,然后对 activity的生命周期进行拦截,然后插入自己的功能。 如果需要混淆 第一步 你要先引入你得架包 -libraryjars libs/android-support-v4.jar -libraryjars libs/loonandroid.jar 第二步 你要保证注解在代码优化的时候不能被删除掉 -keepattributes Signature -keepattributes Annotation第三步 support4 要排除掉 -dontwarn android.support.v4.** -keep class android.support.v4.** { ; } -keep interface android.support.v4.app.* { ; } -keep public class * extends android.support.v4.* -keep public class * extends android.app.Fragment 第四步 只要使用了注解的包名 全部排除掉 -dontwarn xxx.** -keep class xxx.** { ; } 其中XXX替换成你使用了注解的包名第五步 保证R不被混淆 -keep class *.R$* { *; } 即OK 框架的主要功能 其中分为以下几种: 自动注入框架(只需要继承框架内的application既可) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性) 网络请求模块(继承了基本上现在所有的http请求) eventbus(集成一个开源的框架) 验证框架(集成开源框架) json解析(支持解析成集合或者对象) 数据库(不知道是哪位写的 忘记了) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) 自动更新模块 一系列工具类 一 自动注入框架 1 无需继承任何BaseActivity 举例:普通activity publicclassFourActivityextendsActivity{ Viewxx; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main4); xx=find......; //--------------------------------------------------------- 组件的初始化 //--------------------------------------------------------- } } 这其中我们会耗费大量的代码或者重复性的去些一些代码。特别是布局比较复杂的情况下。 如果用框架 @InjectLayer(R.layout.activity_main3) publicclassThirdActivityextendsActivity{ @InjectView Viewxx; } 即可 像软件的说明页面,就是单纯的展示一个布局,那么就是 @InjectLayer(R.layout.activity_main3) publicclassThirdActivityextendsActivity{ } 即可 整个ioc框架不需要你继承任何的acitivity,这样就保证了不会在你的代码结构层次上造成影响,因为有的时候你需要自己的BaseActivity来实现你公用的功能。 2 支持子父布局 这种情况下,对于一般的框架来说,做法有以下几种: ActivityGroup 一般的ioc框架都需要继承框架内的activity,activitygroup会让很多框架用不了,现在ActivityGroup也是不提倡的了。 BaseActivity 一般的Ioc框架会需要你的BaseActivity 去继承框架内的activity 中间用fragment 这样的情况也一样,你的FragmentActivity必须继承它的activity才能实现ioc框架功能。对于这个框架来说很容易实现 1 ActivityGroup 你不需要继承任何activity 和普通activity 实现方式(如上面的例子) 2 BaseActivity 见代码: 首先是BaseActivity @InjectPLayer(R.layout.activity_com) public class BaseActivity extends Activity {} 其中R.layout.activity_com是包括上下导航的布局,中间是一个view子activity只需要这么写即可 @InjectLayer(value=R.layout.activity_main,parent=R.id.common) publicclassMainActivityextendsBaseActivity{} 当然 又会有问题了,那么我上下导航里面的点击事件怎么绑定,怎么去初始化,难道要每一个子activity都要去写吗?当然不需要 @InjectPLayer(R.layout.activity_com) publicclassBaseActivityextendsActivity{ @InjectInit privatevoidinit(){ MeApplication.logger.s("公共类的初始化"); } //这里是第一种交互事件注入方式(单击) @InjectMethod(@InjectListener(ids={R.id.top,R.id.bottom},listeners={OnClick.class})) privatevoidclick2(Viewview){ Handler_TextStylehandler_TextStyle=newHandler_TextStyle(); switch(view.getId()){ caseR.id.top: handler_TextStyle.setString("点击了顶部按钮(在基类中统一注册,也可以单独注册)"); handler_TextStyle.setBackgroundColor(Color.RED,3,5); Toast.makeText(this,handler_TextStyle.getSpannableString(),Toast.LENGTH_LONG).show(); break; caseR.id.bottom: handler_TextStyle.setString("点击了底部按钮(在基类中统一注册,也可以单独注册)"); handler_TextStyle.setBackgroundColor(Color.RED,3,5); Toast.makeText(this,handler_TextStyle.getSpannableString(),Toast.LENGTH_LONG).show(); break; } } } 如上 其中@InjectInit注解表示不管是在子activity还是父activity 都是在布局初始化完成以后才会调用,其先后顺序是 父布局layout->子布局layout->父布局ioc和事件绑定->子布局事件绑定。 父activity 中可以对所有的公用组件和事件进行初始化和绑定还没完,又会有另一个问题,如果我某个页面下导航的a按钮和其他页面底部a按钮的功能不一样 要单独设置怎么办。那么我们可以在子布局进行@InjectMethod和@InjectView进行事件绑定和组件注入,它们会覆盖父类中相同id的组 件的操作以下是view注入的方法说明: @InjectPLayer 表示是Activity的setContentView @InjectLayer(value=R.layout.activity_main2,parent=R.id.common,isFull=true,isTitle=true) 其中需要哪个参数就用哪个,value 是必须的 如果只有layout可以这么写@InjectPLayer(R.layout.activity_com)。其中value 表示layout,parent表示它在父布局中所对应组件的id 如上图中 中间显示区域的view的id。Isfull是否全屏,默认为false.isTitle 是否有标题,默认false; @InjectView 自动注入view注解。 基本写法: @InjectView TextViewtest; 其中test表示它在xml中对应的Id为test @InjectView(R.id.next2) TextViewtest; 表示它在xml中对应的Id为next2 高级写法: @InjectView(binders={@InjectBinder(method="click",listeners={OnClick.class,OnLongClick.class})}) Buttonnext,next3,next4; 其中表示对id为next,next3,next4进行注解,其中binders 表示绑定了以下事件,binders 是个数组,也就是说可以用多个InjectBinder绑定多个事件,也可以用listeners = { OnClick.class, OnLongClick.class }来表示对组件注入了点击事件和长按事件 @InjectView(value=R.id.next2,binders={@InjectBinder(method="click",listeners={OnClick.class})}) Buttonbutton; 对于变量名和组件id不一致的view则需要设置value Click 表示那些注入的事件触发以后所调用的方法,其必须在当前类内。 // 支持由参数和无参数 即click(View view)或者click() 当然click名字必须对于变量注解中的method = “click” privatevoidclick(Viewview){ switch(view.getId()){ caseR.id.next: startActivity(newIntent(this,ThirdActivity.class)); break; ... } } @InjectResource @InjectResource Stringaction_settings; @InjectResource Drawableic_launcher; InjectResource支持string和drawable的注解 @InjectMethod // 底部导航栏 子类覆盖父类 @InjectMethod(@InjectListener(ids={R.id.bottom},listeners={OnClick.class,OnLongClick.class})) privatevoidclick3(Viewview){ Handler_TextStylehandler_TextStyle=newHandler_TextStyle(); handler_TextStyle.setString("点击了底部按钮子类覆盖了父类"); handler_TextStyle.setBackgroundColor(Color.RED,3,5); Toast.makeText(this,handler_TextStyle.getSpannableString(),Toast.LENGTH_LONG).show(); } @InjectMethod是当我们对一个组件只需要触发而不需要find出来的时候用到。 ids 表示绑定哪些id,listeners 表示绑定哪些事件 这两个参数都是数组 当然 如果嫌注解字段太长,可以自己修改。这个是整个view的注入。 @InjectInit @InjectInit voidinit(){ MeApplication.logger.s("子类的初始化"); test.setText("初始化完成,第一个页面"); } 这个注解你在activity中添加到任何一个方法名上,那么,当所有的layout和所有的view以及事件绑定完毕以后,会第一个调用含有这个注解的方法。它相当于oncreat 注意:框架注解了整个activity的生命周期,@InjectOnNewIntent,@InjectPause,@InjectResume, @InjectRestart,@InjectStart,@InjectStop其中OnDestroy无注解。 如果Activity中有含有这些注解的方法那么不同生命周期下回自动调用这些方法 二:Fragment的自动注入 @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){ this.inflater=inflater; ViewrootView=inflater.inflate(R.layout.activity_left,container,false); Handler_Inject.injectView(this,rootView); returnrootView; } 只需要在onCreateView里面调用Handler_Inject.injectView(this,rootView); 即可 在fragment中除了activity的生命周期注解和@InjectLayer注解无法使用外,组件绑定和事件绑定都可以使用,@InjectBefore也可以使用 @InjectBefore是在组件初始化之前调用 三:图片下载框架 这个是图片框架重写了好多次了,总是有点问题,里面基本上每一段代码都有注释,还有一些bug, 因为项目中用的还是这次重写之前的。 如果大家发现问题,记得告诉我框架中调用的方法名和参数基本上都不会变,避免替换jar导致需要改动大部分代码。 整个图片下载的逻辑是这样的: 1 根据url和view去调用图片下载的方法 2 从缓存去拿bitmap 3 如果bitmap不为空 判断是否针对这个url有单独的配置 没有则使用全局配置加载图片 4 如果bitmap为空 则开启线程,放到本地线程池中,然后从本地文件读取 5 如果文件存在,则转为bitmap放到缓存,然后重复2,然后9 6 如果文件不存在,则开启线程放到网络线程池中去下载文件 7 下载成功则放到本地sdcard 然后把文件转为bitmap放到缓存,然后重复2,然后9 8 下载不成功,然后重复2,然后9 9 如果bitmap不为空 判断是否针对这个url有单独的配置 没有则使用全局配置加载这张图片 如果bitmap为空 则显示失败的默认图 具体的流程 可以参考源码 缓存分为三层 第一层是LruCache(原理去百度) 第二层是LinkedHashMap 第三层是view标记 1当LruCache中的图片超过了规定了内存,那么从LruCache移除一个使用最少的,放到LinkedHashMap中 2当每一张图片的url对应一个count,一旦加载一张图片,那么这个url的count加1 3自定义AsyImageView继承ImageView,重写了onDetachedFromWindow方法,一旦 AsyImageView从当前视图移除掉会调用onDetachedFromWindow该方法,此刻该图片所对应的url数目count减1 4因为listview中的imageview如果用了ViewHolder那么第3条就不适合了,此刻每一个imagview的hashCode对应一个url, 一旦imagview更换了一个新的url,那么该imagview的hashcode上一个的引用将被移除, 那么上一次显示的url所对应的count将减1 5当LinkedHashMap超过了规定限制的时候,那么遍历所有的count一旦count为0则移除回收 图片下载使用 一:必须条件 必须在配置文件中添加配置,来打开图片下载引擎的初始化,为了减少启动时间,默认关闭。 #开启框架内置的图片下载如果不设置则无法使用框架类的图片下载 imageload_open=true 二:使用方法 1 普通图片下载 ImageDownloader.download("网络和本地图片链接",mAsyImageView); 如果需要配置bitmap的高宽 第一种方式: 在xml布局文件中对AsyImageView的高宽进行设置 第二种方式: 全局图片配置,所有图片显示默认用此配置 GlobalConfigglobalConfig=GlobalConfig.getInstance(); globalConfig.setMaxWidth(w); 来设置 第三种 SingleConfigconfig=newSingleConfig(); config....设置宽高 ImageDownloader.download("网络和本地图片链接",mAsyImageView,config) 其中优先级 第三种 > 第一种 > 第二种 其中GlobalConfig支持的设置有高宽的设置,内存缓存的大小,默认图片, 下载失败的图片,最大缓存数目,线程池,缓存类型,显示控制,listview得滑动监听,图片加载动画 其中SingleConfig支持的设置有高宽的设置,默认图片,下载失败的图片,下载进度,显示控制,加载动画 其中SingleConfig 优先于GlobalConfig 支持配置文件配置: mAsyImageView.setTemplate("one"); ImageDownloader.download("url",mAsyImageView); 其中one在配置文件里面配置,这样 不管在任何地方,只要AsyImageView.setTemplate(“one”);就可以使用名称为one的配置了。 支持本地文件加载调用接口不变。 需要进度显示的: SingleConfigconfig=newSingleConfig(); config.setDisplayer(newDisplayerLister(){ @Override publicvoidstartLoader(AsyImageViewimageView){ super.startLoader(imageView); } @Override publicBitmapfinishLoader(Bitmapbitmap,AsyImageViewimageView){ pin_progress_1.setVisibility(View.GONE); returnbitmap; } @Override publicvoidprogressLoader(intprogress,AsyImageViewimageView){ pin_progress_1.setProgress(progress); super.progressLoader(progress,imageView); } }); ImageDownloader.download("url",photo,config); 其中url的服务器必须支持获取文件长度 需要显示动画的:如果是单独某一个图片 SingleConfigconfig=newSingleConfig(); config.setDisplayerAnimation(newFadeInAnimation()); 如果是全局的 GlobalConfigconfig=newGlobalConfig(); config.setDisplayerAnimation(newFadeInAnimation()); 其中FadeInAnimation是框架自带的一个渐变的动画如果需要自定义 实现DisplayerAnimation接口即可 2 listview中图片下载 只要在listview的注解@InjectView(isasy=true)中添加了isasy=true(默认为false) 那么系统会自动给你注入OnScrollListener滚动事件,以便实现图片飞行停止才加载,缓慢拖动加载的功能。如果你要实现自己的OnScrollListener 如下 @InjectBefore voidtest(){ //@InjectView(isasy=true)表示这个listview里面有网络图片下载,并且需要实现滑动停止才加载的功能 //@InjectView(isasy=true)框架会给listview自动注入OnScrollListener,如果你自己也要滚动监听 //那么请在此配置,如下 GlobalConfigconfig=GlobalConfig.getInstance(); config.setOnScrollLoaderListener(newMyOnScrollListener()); System.out.println("before"); } //必须继承框架内的滚动监听 classMyOnScrollListenerextendsOnScrollLoaderListener{ @Override publicvoidonScrollListener(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){ ApplicationBean.logger.s("滚动监听:"+firstVisibleItem); } @Override publicvoidonScrollStateChange(AbsListViewview,intscrollState){ ApplicationBean.logger.s("滚动状态"); } } @InjectBefore表示在组件初始化以前开始调用,因为滚动监听必须在listview被初始化之前赋值,否则无效将默认使用框架内的滚动监听 3 无需显示的图片下载 ImageDownloader.download("url",newLoaderLister(){ @Override publicvoidfinishLoader(Stringurl,Filefile){ System.out.println("下载完成"+file.getPath()); } @Override publicvoidfailLoader(Stringurl){ System.out.println("下载失败"); } }); 如果需要下载进度 ImageDownloader.download("url",newLoaderLister(){ @Override publicvoidstartLoader(Stringurl){ System.out.println("开始下载"); super.startLoader(url); } @Override publicvoidfinishLoader(Stringurl,Filefile){ System.out.println("下载完成"+file.getPath()); } @Override publicvoidprogressLoader(intprogress){ System.out.println("下载进度"+progress); super.progressLoader(progress); } }); 来源:51CTO

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

用户登录
用户注册