Android编译出错:The Android Gradle plugin supports only Kotlin Gradle plugin version 1.2.51 and higher. Project ‘Test’ is using version 1.2.30. 打开build.gradle(Project) 修改buildscript中的ext.kotlin_version = ‘1.2.30’ 改成ext.kotlin_version = ‘1.2.51’ 最后点击Sync Now,重新编译就好了 from:https://blog.csdn.net/qq_34947048/article/details/85250198
View Details今天安装了Android Studio 3.2,打开一个旧工程,编译提示"No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android" 网上也有解决办法,就是下载旧版的NDK,将其中的toolchain复制到新版的NDK中 但是感觉这种方式,不是解决的正道。 经过对新版NDK的研究,发现NDK的更新记录里有一段话 This version of the NDK is incompatible with the Android Gradle plugin version 3.0 or older. If you see an error like No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android, update your project file to [use plugin version 3.1 or newer]. You will also need to upgrade to Android Studio 3.1 or newer. 也就是说新版本的NDK与3.0及以前旧版的Android Gradle plugin插件不兼容 其实解决方法很简单,就是修改build.gradle中的红字部分,改为3.1以上版本即可
1 2 3 4 5 6 |
dependencies { classpath 'com.android.tools.build:gradle:3.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } |
from:https://blog.csdn.net/vocanicy/article/details/83004626
View Details编译错误提示:Gradle sync failed: Could not run build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-4.1-all.zip'. 点击Gradle Console NDK is missing a "platforms" directory. If you are using NDK, verify the ndk.dir is set to a valid NDK directory. It is currently set to D:\AndroidStudioSDK\ndk-bundle. If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning. 不言而喻,NDK缺少一个“platforms”目录。如果您正在使用NDK,请验证NDK。将dir设置为有效的NDK目录。目前它被设置为D: AndroidStudioSDK\ndk-bundle。如果不使用NDK,请从ANDROID_NDK_HOME或local中卸载NDK变量。属性删除此警告。 这个错误Google 的坑。目前只有兼容最新的NDK版本才能解决。 解决办法: 1.打开SDK Manager 2.勾选上NDK最新版本,安装成功后Apply 3.安装完成后重新build下项目搞定! from:https://blog.csdn.net/github_36787585/article/details/82841129
View DetailsMap 接口中键和值一一映射. 可以通过键来获取值。 给定一个键和一个值,你可以将该值存储在一个 Map 对象。之后,你可以通过键来访问对应的值。 当访问的值不存在的时候,方法就会抛出一个 NoSuchElementException 异常。 当对象的类型和 Map 里元素类型不兼容的时候,就会抛出一个 ClassCastException 异常。 当在不允许使用 Null 对象的 Map 中使用 Null 对象,会抛出一个 NullPointerException 异常。 当尝试修改一个只读的 Map 时,会抛出一个 UnsupportedOperationException 异常。 序号 方法描述 1 void clear( ) 从此映射中移除所有映射关系(可选操作)。 2 boolean containsKey(Object k) 如果此映射包含指定键的映射关系,则返回 true。 3 boolean containsValue(Object v) 如果此映射将一个或多个键映射到指定值,则返回 true。 4 Set entrySet( ) 返回此映射中包含的映射关系的 Set 视图。 5 boolean equals(Object obj) 比较指定的对象与此映射是否相等。 6 Object get(Object k) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 7 int hashCode( ) 返回此映射的哈希码值。 8 boolean isEmpty( ) 如果此映射未包含键-值映射关系,则返回 true。 9 Set keySet( ) 返回此映射中包含的键的 Set 视图。 10 Object put(Object k, Object v) 将指定的值与此映射中的指定键关联(可选操作)。 11 void putAll(Map m) […]
View Details修改系统变量 变量名:ANDROID_SDK_HOME 变量值:存放avd的路径,如:D:\AVD 在Android Studio中运行模拟器时,提示Error: Not enough disk space to run AVD '….'. Exiting。是说安装模拟的磁盘空间不足,导致无法运行模拟器。 Android Studio 安装之后,默认的模拟器会安装在C盘中,可以打开模拟器管理界面,右键查看(Show on disk)模拟器安装的目录。如下图: 我的模拟器安装路径为: C:\Users\Administrator\.android\avd, 其中的avd文件夹就是用来存放模拟器镜像文件的。 第一步:需要将Pixel_API_27.avd的文件夹移出C盘,放入空间足够的磁盘中。 第二步:就是要修改Pixel_API_27.ini(在此就称为模拟器配置文件吧,我也是新手不太懂)文件中模拟器的路径。 然后重新运行模拟器,没有问题应该可以运行起来。 from:https://www.cnblogs.com/wang2804355025/p/13155556.html
View DetailsC#中连接MySql数据库,需要配置MySql.Data。 1.配置 项目- 管理NuGet程序包 – 安装MySql.Data。 2.示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using MySql.Data.MySqlClient; using System; namespace MySQL { class Program { static void Main(string[] args) { string server = "172.0.0.1"; string database = "test"; string uid = "root"; string password = "123456"; string SslMode = "none"; string connectionString; connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";" + "SslMode=" + SslMode; MySqlConnection mycon = new MySqlConnection(connectionString); mycon.Open(); MySqlCommand mycmd = new MySqlCommand("insert into buyer(name,password,email) values('小王','dikd3939','1134384387@qq.com')", mycon); if (mycmd.ExecuteNonQuery() > 0) { Console.WriteLine("数据插入成功!"); } Console.ReadLine(); mycon.Close(); } } } |
3.注意事项 运行上述代码,如果出现异常 “IOException: Unable to read data from the transport connection: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”。首先,确认数据库是否允许远程连接;其次,防火墙是否打开;最后,连接字符串是否正确,是否支持SSL。 出现异常“The host localhost does not support SSL connections.”说明不支持SSL,需要在连接字符串里添加SslMode = "none"。 from:https://blog.csdn.net/liyazhen2011/article/details/82845279
View Details面试之家只是为了学习和交流使用Weex,题库等内容不可用于商业项目 在Weex开发中,使用自定义Module的方式,来扩展Weex的能力,官方教程在这里,这里我以自定义分享模块来举例 第一步 先创建一个继承与NSObject的基类UM_WeexModule,然后引入头文件#import <WeexSDK.h>,并继承WXModuleProtocol协议。 第二步 实现方法并暴露给JS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
- (void)shareEvent:(NSDictionary *)parames callback:(WXModuleKeepAliveCallback)callback { if (![parames isKindOfClass:NSClassFromString(@"NSDictionary")]) { [SVProgressHUD showErrorWithStatus:@"非法传参"]; return; } [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) { switch (platformType) { case UMSocialPlatformType_Sina: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_Sina]) { [SVProgressHUD showErrorWithStatus:@"未安装新浪客户端"]; return ; } } break; case UMSocialPlatformType_WechatSession: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_WechatSession]) { [SVProgressHUD showErrorWithStatus:@"未安装微信客户端"]; return ; } } break; case UMSocialPlatformType_WechatTimeLine: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_WechatTimeLine]) { [SVProgressHUD showErrorWithStatus:@"未安装微信客户端"]; return ; } } break; case UMSocialPlatformType_QQ: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_QQ]) { [SVProgressHUD showErrorWithStatus:@"未安装QQ客户端"]; return ; } } break; case UMSocialPlatformType_Qzone: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_Qzone]) { [SVProgressHUD showErrorWithStatus:@"未安装QQ客户端"]; return ; } } break; default: break; } NSString *type = parames[@"type"]; NSString *title = parames[@"title"]; NSString *des =parames[@"des"]; NSString *picUrl = parames[@"picUrl"]; NSString *linkUrl = parames[@"linkUrl"]; //创建分享消息对象 UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; if ([type isEqualToString:@"link"]) { //创建网页内容对象 UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:des thumImage:picUrl]; //设置网页地址 shareObject.webpageUrl = linkUrl; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; } else if ([type isEqualToString:@"pic"]) { //创建图片内容对象 UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; [shareObject setShareImage:picUrl]; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; } else if ([type isEqualToString:@"richText"]) { //设置文本 messageObject.text = title; //创建图片内容对象 UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; //如果有缩略图,则设置缩略图 shareObject.thumbImage = [UIImage imageNamed:@"icon"]; [shareObject setShareImage:picUrl]; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; } [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:nil completion:^(id data, NSError *error) { if (error) { callback(error.userInfo[@"message"],false); }else{ [SVProgressHUD showSuccessWithStatus:@"分享成功"]; callback(@"1",false); } }]; }]; } - (void)setalias:(NSDictionary *)params { [UMessage addAlias:[NSString stringWithFormat:@"%@",params[@"userID"]] type:params[@"type"] response:^(id _Nonnull responseObject, NSError * _Nonnull error) { }]; } |
第三步 将方法抛出给JS
1 2 |
WX_EXPORT_METHOD(@selector(shareEvent: callback:)) WX_EXPORT_METHOD(@selector(setalias:)) |
第四步 初始化时注册到WeexSDK
1 |
[WXSDKEngine registerModule:@"UM_Event" withClass:NSClassFromString(@"UM_WeexModule")]; |
第五步 JS调用
1 2 3 4 5 6 7 8 |
var um_share = weex.requireModule('UM_Event'); um_share.shareEvent({ type:'pic', title:'title', picUrl:'https://mianshizhijia.oss-cn-hangzhou.aliyuncs.com/resourse_image/%E5%88%86%E4%BA%AB.jpg', }, callback => { }); |
结语 本篇文章旨在分享如何通过自定义Module来扩展Weex的能力,由于最近在忙于找工作,所以写的不是很深入,等过段时间稳定之后,会在继续分享Weex实现原理,以及从注册方法到可以被JS调用中间的实现过程。 作者:GL_fire 链接:https://www.jianshu.com/p/37b884515125 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
View Details上一篇文章我们配置了jdk version,这一节就来配置Android SDK环境搭建 Android SDK是Android平台上进行软件开发所需要的开发包,这里我们通过安装Android Studio的方式来安装Android SDK,Android Studio 是Android开发的IDE(集成开发环境),至少是2.0 或者更新版本 同样打开如下连接,此官方网站容易被墙 https://developer.android.com/studio/index.html 如果打不开换下面的路径,此为 android sdk 中文网站,下载 Android Studio http://www.androiddevtools.cn/ 然后运行你们下载的Android Studio进行安装,全选,然后下一步 到此处后,路径可以修改,我就都安装在D盘了,而且还是在同一个目录下,建议大家按照我的来安装, 注意安装目录不能有中文 第一个安装目录修改为 D:\Android\AndroidStudio 第二个安装目录修改为 D:\Android\sdk 我的安装位置 然后一直下一步,去掉勾选,点击finish 然后打开刚才修改的安装路径 D:\Android\sdk,运行 SDK Manager.exe 勾选下面几个(23.0.2一定要下),然后点击 install packages 安装成功后就开始安装环境变量,同样是在用户环境变量中新建一个(因为我已配置好) 变量名: ANDROID_HOME 变量值: D:\Android\sdk 然后在修改用户环境变量 path,是添加两个 变量名: path 变量值: %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools 如果环境变量是如下图的小伙伴,则在变量值最后面加上 ;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools 同样最后我们来检测是否安装和配置好,输入cmd打开命令行工具 输入 adb 如果出现的结果跟下面的图一样,那么恭喜你环境已经搭建好了 weex的环境变量就这样配置成功了,那么就开始入坑之旅吧! from:https://blog.csdn.net/k491022087/article/details/72934862
View Details版权声明:这可是本菇凉辛辛苦苦原创的,转载请一定带上我家地址,不要忘记了哈 . https://blog.csdn.net/u011314442/article/details/90140532
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import tk.mybatis.mapper.entity.Example; import com.github.pagehelper.PageHelper; ... @Override public List<RepaymentPlan> listRepaymentPlan(Integer start) { Example example = new Example(RepaymentPlan.class); // 排序 example.orderBy("id"); // 条件查询 example.createCriteria() .andNotEqualTo("repayStatus", 3) .andLessThanOrEqualTo("shouldRepayDate", new Date()); // 分页 PageHelper.startPage(start, 20); // 每次查询20条 return repaymentPlanMapper.selectByExample(example); } |
2. PageHelper 使用详解见文章:分页插件pageHelpler的使用(ssm框架中)服务器端分页 3. 更多关于 Example 的使用说明见文章: java 查询功能实现的八种方式 MyBatis : Mapper 接口以及 Example 使用实例、详解 4. 当只是查询数据,不需要返回总条数时可选择此方法:
1 |
PageHelper.startPage(第几页, 20,false); // 每次查询20条 |
当数据量极大时,可以快速查询,忽略总条数的查询,减少查询时间。 以下是该方法原码实现: ————————————————- 2019.5.13 后记 : 1)分页的写法 下图中黄框中的写法运行 比红框中 快,不知道是不是插件本身也会有费时: 2)再补充一种分页方式,mybatis 自带的 RowBounds:
1 2 3 4 5 6 7 8 9 10 |
public List<RepayPlan> listRepayPlan(int start) { // 查询所有未还款结清且应还日期小于当前时间的账单 Example example = new Example(RepayPlan.class); example.orderBy("id "); // 按id排序 example.createCriteria() .andNotEqualTo("repayStatus", 3) .andLessThanOrEqualTo("shouldRepayDate", new Date()); RowBounds rowBounds = new RowBounds(start, 20); // 每次查询20条 return epaymentPlanMapper.selectByExampleAndRowBounds(example,rowBounds); } |
推荐用 RowBounds :mybatis 自带的,且速度快 。个人运行,后 2 种分页明显比 PageHelper 快。 from:https://cloud.tencent.com/developer/article/1433161
View Details在开发过程中遇到一个问题,服务器经过排序返回后的字符串数据使用fastjson解析后,数据顺序发生变化,引起业务异常。 解决办法: 1、解析时增加参数不调整顺序 JSONObject respondeBodyJson = JSONObject.parseObject(jsonStr, Feature.OrderedField); 2、初始化json对象为有序对象: JSONObject retObj = new JSONObject(true); 这样生成的json对象就与放入数据时一致。 3、使用Gson解析 JsonObject returnData = new JsonParser().parse(replyString).getAsJsonObject(); ———————————————— 版权声明:本文为CSDN博主「long2010110」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/long2010110/article/details/81537820
View Details