一些阅读和问题后,像这样的,我想知道是否有在使用点@NonNull支持Android注解.
如果我尝试使用注释为@NonNull的null参数调用方法,我可以看到来自Android Studio的非常小的警告.只是警告??
单元测试怎么样?我应该用空参数测试方法吗?如果我这样做......我会得到一个NullPointerException,我的测试将失败.
假设我们是两位开发人员.一个在API上工作,另一个在各种方式下测试API.作为第二个开发人员,我有责任测试所有内容,以便API可以防弹.这是单元测试的重点,对吗?
那么......第一个使用@NonNull的开发人员有什么意义呢?
如果其他人将此API与null参数一起使用......那么API将抛出NPE.然后他会想:"Urg,那个API糟透了...... NPE!" 他会是对的.那个顽皮的开发人员没有检查他发送的参数是否为null应该面临一个IllegalArgumentException,因为这是他的错误而不是API的错误!
我错了吗 ?
我认为这些注释会强制编译器显示错误attempting to call methodName(@NonNull Object object) with null parameter.
好的,谢谢大家的意见.如果可能的话,我想总结一下我在这里遇到的"问题".以抽象的方式.
我编写了一些代码(一个API,一个库,一个类,等等),私有内部代码由提供功能的公共方法包装.
假设这些公共方法将被其他任何人(包括我)使用.他们中的一些人接受的决定必须永远不会为空,否则所有地狱都会破裂.
阅读您的评论,我面临以下选择:
@NonNullJava文档规定支持的合同/注释()parameter must not be null.不要检查空参数(否则IDE会警告我),不知何故,祈祷我永远不会收到空参数;condition will always be false)并且IllegalArgumentException在我收到空参数的情况下抛出而不是导致NPE;最后,对于单元测试......我知道我不能使用防弹代码,但我喜欢尽可能地"测试"我的代码,以防止我的代码出现意外行为以及验证过程(这是在单元测试的基础上,我相信) -
我刚刚开始使用MockK在基于 MVP 的应用程序中模拟所有存储库/服务逻辑以进行 UI 测试。
我有一些运行登录活动的 UI 测试,其中 Espresso 输入登录名和密码,并使用 MockK 我可以伪造登录失败与否的各种情况。
所有服务和存储库都是标准的 Kotlin 对象,所以我使用mockkobject和every/coEvery来覆盖和处理登录请求和任务。
在我的物理设备上,测试完全没有问题,但是一旦我尝试在运行 Android P+ 并带有推荐图像的模拟器上运行它们,它们就会在随机时间不断崩溃。在极少数情况下,它们可以存活足够长的时间来工作。
查看日志,我得到了各种 SIGSEGV:
A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 10425 (e.android.debug) 中的故障地址 0x0,pid 10425 (e.android.debug)
A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 10968 (HeapTaskDaemon) 中的故障地址 0xc,pid 10957 (e.android.debug)
A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 15050 中的故障地址 0x0 (firebase-instal),pid 14972 (e.android.debug)
A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 8902 中的故障地址 0xd (Measurement Wor),pid 8858 (e.android.debug)
A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 22004 …
我对Android Studio Designer有一个奇怪的问题.
我正在尝试处理我的布局,以便它们适合多种屏幕尺寸和密度.
我需要为不同的标签设置不同的文字大小.有些更大,有些更小.
所以我创建了几个dimens.xml文件(一个用于小文件,一个用于大文件,默认情况下不会忘记一个),这样我就可以看到它会在非常小的设备和相当大的设备上显示.
使用设计师和Nexus 4,我发现自己处于一种奇怪的境地:虽然Android Studio中的"Nexus 4"预览显示尺寸不错,但最终结果却很糟糕.首先,我发现我的Nexus 4或我的Galaxy Note 3使用large/dimens.xml.它们都使用相同的:value/dimens.xml.怎么会 ?屏幕尺寸不一样,甚至密度和分辨率都不一样!
因此,尽管我在XML中设置了特定尺寸,即使Android Studio Designer在"Nexus 4"上显示出良好的比例,但我的应用程序根本没有反映出我在设计器上看到的内容!为什么?较小的文本看起来很大,较大的文本看起来太大......总而言之,在我的Nexus 4和GN 3上,一切都不成比例!
更多细节:我使用Android Studio来设计我的所有布局和资源.我使用Xamarin来完成我的工作.我确保所有XML文件在两个IDE上完全相同.为了证明我没有错,在同一设备预览(Nexus 4)上显示结果的两个IDE设计者显示完全相同的比率.意思是,正在使用正确的尺寸.那么为什么我在"真正的"Nexus 4上看不到同样的东西呢?
谢谢您的帮助 !
到目前为止,我的问题很难解决.
我应该和我的同事一起开发一个Android应用程序,它在iOS上做同样的事情.
在开发结束时,我们应该提供两个做同样事情并且看起来很相似的应用程序(可以放心,没有像iOS指南那样强制在Android上使用,反之亦然),这样体验就是一样的,身临其境.
提供的顶级功能之一是一个漂亮的白色空圆圈动画,在圆圈内发出雪状粒子.圆圈可以通过滚动或简单的弹跳/滑动动画来移动.
因此,想象一个带有白色边框的圆圈和白色颗粒离开那个白色的膜.所有这些粒子都被吸引到中心,它们的速度基础是变化的(但没有加速!).假设最快的粒子在到达中心之前"死亡".可以通过设置终身和速度轻松设置的东西.
我的伙伴,像我这样的大三学生,正在使用iOS'CAEmitterLayer,她在一两天内获得的结果非常华丽,非常接近我们应该达到的目标.
在我身边,我真的很挣扎.像她一样,我对任何动画和UI/UX都没有任何经验.在Android上寻找粒子生成器/发射器时,我偶然发现了这个漂亮的库:https://github.com/plattysoft/Leonids,它似乎可以提供我想要的东西.
但是我使用这个库有一些未解决的问题:
正如我所说,我的iOS同事解决了这些问题.即使是动人的部分:我们正在和我们的经理谈话,他们告诉我们"如果圆圈移动怎么办?" 她立刻在我们面前试了一下.我被吹走了......
她告诉我,我应该寻找一种方法将我的粒子包含在一个容器内(有意义^^),并且我的圆形视图应该用图层剪裁,这样粒子就不会离开圆圈,特别是如果整个东西都在移动.
这是我通过前面提到的Android库实现的目标:
height和width)和奇怪的原因,我的圈画上面说基于平方的观点.我希望我能找到另一个图书馆,但如果当前的图书馆正在运作,为什么不呢?试试我的运气^^
谢谢您的帮助 !
我试图根据自ListView定义Cell列表定制自定义objects.
自定义对象是调用的类名Message,其中包含消息内容,收件人,时间戳和状态(读取,发送等)的几个字段.
看了这个问题:使用FXML在JavaFX中自定义ListView我已经成功:
但是,我无法链接两者:我似乎无法找到一种方法,以便ListView的当前项被发送到Cell Controller.
这是我的单元工厂代码和ListView项目填充:
final ObservableList observableList = FXCollections.observableArrayList();
observableList.setAll(myMessages); //assume myMessage is a ArrayList<Message>
conversation.setItems(observableList); //the listview
conversation.setCellFactory(new Callback<ListView<Message>, ListCell<Message>>() {
@Override
public ConversationCell<Message> call(ListView<Message> listView) {
return new ConversationCell();
}
});
Run Code Online (Sandbox Code Playgroud)
而现在,ConversationCell类:
public final class ConversationCell<Message> extends ListCell<Message> {
@Override
protected void updateItem(Message item, boolean empty) {
super.updateItem(item, …Run Code Online (Sandbox Code Playgroud) 我从看起来很棒的图书馆听到了很多好消息,但我发现自己处于一种微妙的境地。
这是我工作过的第一个项目,我应该将电话号码存储在数据库中。
我已经阅读了一些关于E.164格式的内容,我确实打算将所有使用这种格式的电话号码存储在我的数据库中。
我面临的问题是数据源。我无法控制数据源。我所知道的是,我收到了一堆电话号码,而且它们的格式不一致。有些有国际分机,有些没有。有些有括号、连字符、前导 0 等,有些没有。
我怎么可能从所述来源中提取电话号码,将它们格式化为 E.164,以便我可以安全地存储它们?
我尝试在PhoneNumberUtil#parse()不提供国家代码的情况下使用该方法,因为我无法访问该信息。
看看下面的例子:
System.out.printLn("Number -> " + phoneNumberUtil.parse("00336555233634", null).toString())
Run Code Online (Sandbox Code Playgroud)
错误类型:INVALID_COUNTRY_CODE。缺少或无效的默认区域。
在我的例子中,号码是法国手机的号码。0我相信,如果您从法国以外的地方拨打电话,则这两个启动项都有效。
但是图书馆无法理解它,因为它正在吸收国家/地区代码。 这是否意味着不存在了解该特定电话号码来自何处的方法?
文档似乎很清楚:
public PhoneNumber parse(CharSequence numberToParse, String defaultRegion)
Run Code Online (Sandbox Code Playgroud)
@param defaultRegion 我们期望数字来自的区域。仅当 * 解析的数字不是以国际格式写入时才使用。
在这种情况下,*编号的国家/地区代码将作为提供的默认区域的国家/地区代码存储。如果数字 * 保证以“+”开头,后跟国家/地区调用代码,则可以提供 RegionCode.ZZ * 或 null。
所以,如果添加 +33
System.out.printLn("Number -> " + phoneNumberUtil.parse("+336555233634", null).toString())
Run Code Online (Sandbox Code Playgroud)
那么结果自然是:
号码 -> 国家代码:33 国家号码:336555233634
如果最终用户向我的应用提供不以 开头的电话号码,我应该/可以做什么+?如果出现这种情况,我无法相信我是唯一的人。
谢谢您的帮助 !
我需要帮助同时播放多个音轨Android.
我应该在同一时间播放三个音轨Android.Media.MediaPlayer.
昨天我成功地做到了这样做:
MediaPlayer track1 = MediaPlayer.create(this, R.raw.track1);
MediaPlayer track2 = MediaPlayer.create(this, R.raw.track2);
MediaPlayer track3 = MediaPlayer.create(this, R.raw.track3);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有3个distincts实例的MediaPlaye这里,r.
因为我被要求,我需要MediaPlayer在后台线程中播放这些内容.
这是我开始的部分MediaPlayers:
//let's suppose this code snippet is in a run() method inside a Thread (which is the case)
track1.start();
track2.start();
track3.start();
Run Code Online (Sandbox Code Playgroud)
如果我昨天说,那是因为第二天它没有按预期工作.
实际上,启动MediaPlayer似乎会停止任何以前播放的MediaPlayer.
我在调试器模式下测试:显然,track2.start()停止track1的MediaPlayer并遵循相同的模式,track3.start()停止tack2的MediaPlayer.
所以最后,只有track3正在播放,我无法听到任何以前的曲目,无论音量设置如何,而我之前可以清楚地听到所有曲目:它应该创造某种氛围.
当然,更改曲目的开始顺序不会改变任何内容:只会听到最后一首曲目.
如果我说"听到",那是因为在调试器模式下,检查属性MediaPlayer.isPlaying正在返回true:所有三个玩家都在说他们正在玩,但只有一个可以听到......!
为什么要改变?为什么之后停止工作一次呢?
注意:
我最近开始使用SnapHelper里面提供的内容Support Library v24,以便RecyclerView在Google Play商店中获得漂亮的水平效果.
我的问题很简单.
通过使用RecyclerView.OnScrollListener我可以在滚动状态稳定时得到通知(非常类似于ViewPager.OnPageChangedListener.这很重要,因为当滚动稳定时,我需要为将作为默认行为居中的视图设置动画LinearSnapHelper.该动画显示重点放在即将成为中心的项目上.
现在,我设法通过以下行获得滚动状态空闲时居中的视图:
final int centered = (llm.findLastCompletelyVisibleItemPosition() - llm.findFirstCompletelyVisibleItemPosition()) / 2 + llm.findFirstVisibleItemPosition(); // where llm is my LinearLayoutManager
Run Code Online (Sandbox Code Playgroud)
问题是,当滚动完成时启动动画很奇怪:我真的需要在滚动停止时平滑地播放动画,这样当滚动空闲时,动画也会完成.
所以你可以看到,我很难找到我的哪一项RecyclerView将是一个居中的.
这是我到目前为止尝试的解决方案.
当滚动状态设置为时,我尝试使用相同的计算RecyclerView.SCROLL_STATE_SETTLING.不幸的是,findVisiblePosition当滚动不是空闲时从适配器调用方法是一个坏主意:根据滚动速度,当调用这些所谓的方法时,可见项目在滚动完成时可能不完全相同.实际上它会告诉我在通话时哪些物品是可见的.这完全有道理,但我需要尝试找出...
我尝试扩展,LinearSnapHelper以便在onFling(...)调用时我可以使用findSnapView(...)获取将被捕捉的视图,或者使用findTargetSnapPosition(...)希望告诉我滚动完成时哪个视图居中;
当滚动状态是时RecyclerView.SCROLL_STATE_SETTLING,我也尝试过使用findSnapView(...)
在所有这些解决方案中,没有一个通过多次测试(尝试不同的滑动强度和速度).有些人在一些情况下做对了,但在不同情况下弄错了,因此解决方案无法使用.
看了看之后,LinearSnapHelper我想我开始明白了,不知何故,在滑动之后,这个类计算总滚动并在滚动完成之前多次必要时捕捉视图(滚动距离的数量)因此知道哪个视图将会是最后拍摄的视图 ......除非我把它弄错了因为拍摄不对中?
无论如何,我的主要问题是:无论速度和力度如何 …
使用Android X和Android Architecture Components,即以下...
... 使 Android 开发变得更加容易,以获得更好、更稳定的应用程序。
当对 a使用ViewModel公开LiveDatas 时Fragment,目前有两个LifecycleOwners可用于oberve:
Fragment本身或Fragment的财产mViewLifecycleOwner。到目前为止,我一直并且专门将sFragment本身用于任何和所有LiveData由ViewModels公开的内容。
由于我喜欢通过频繁升级到最新的 alpha 和 beta来生活在边缘,我最近升级到:
2.2.0-rc01;1.1.0-rc01;1.2.0-rc01;2.2.0-rc01;幸运的是,在这个日期(2019 年 11 月 1 日),所有可用的候选版本都可用。
这导致在旧的 Java 代码中警告我:
为什么实际上有两个LifecycleOwners?
在设置 Fragment …
android android-lifecycle android-fragments android-architecture-components androidx
我试图通过这个YouTube 教程遵循 Clean Architecture ,因此我在数据层中有一组模型对象来扩展实体对象。
由于我有很多模型,其中一些模型有很多字段,我希望使用json_serializable包来自动生成样板代码,这些代码是工厂以及与 Json 和 fromJson 转换器方法相关的样板代码。
但是运行时:
flutter pub run build_runner 构建
它失败:
[严重]由于类型原因,无法生成
fromJson代码。serversServer
我的数据架构如下,在数据层:
- HostModel extends Host(Entity)
- String name,
- List<ServerModel> servers,
- ServerModel extends Server(Entity)
- ... // many many fields
Run Code Online (Sandbox Code Playgroud)
然而,当且仅当所有实体类都用 注释时,@JsonSerializable(explicitToJson: true)我才设法使其工作。
这对我来说非常困扰,因为我了解到清洁架构通过层分离所有关注点并遵循 SOLID 原则。所以我认为实体不应该“意识到”原始模型。并且反序列化方法应该可以用任何其他方法(例如 XML)替代,这显然违反了这里的原则。
我该如何解决这个问题?谢谢您的帮助!
android ×7
java ×3
xamarin ×2
android-architecture-components ×1
androidx ×1
animation ×1
annotations ×1
audio ×1
custom-cell ×1
dart ×1
dimensions ×1
flutter ×1
ios ×1
javafx ×1
json ×1
kotlin ×1
layout ×1
listview ×1
mocking ×1
mockk ×1
unit-testing ×1