小编Mac*_*ich的帖子

Android @NonNull的用处

一些阅读和问题后,像这样的,我想知道是否有在使用点@NonNull支持Android注解.

如果我尝试使用注释为@NonNullnull参数调用方法,我可以看到来自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.

更新1

好的,谢谢大家的意见.如果可能的话,我想总结一下我在这里遇到的"问题".以抽象的方式.

我编写了一些代码(一个API,一个库,一个类,等等),私有内部代码由提供功能的公共方法包装.

假设这些公共方法将被其他任何人(包括我)使用.他们中的一些人接受的决定必须永远不会为,否则所有地狱都会破裂.

阅读您的评论,我面临以下选择:

  1. 继续使用@NonNullJava文档规定支持的合同/注释()parameter must not be null.不要检查空参数(否则IDE会警告我),不知何故,祈祷我永远不会收到空参数;
  2. 与上面相同,但强制执行空检查(即使IDE会发出警告condition will always be false)并且IllegalArgumentException在我收到空参数的情况下抛出而不是导致NPE;
  3. 停止使用合同/注释,使用Java Doc警告其他开发人员并添加所有参数的手动检查.

最后,对于单元测试......我知道我不能使用防弹代码,但我喜欢尽可能地"测试"我的代码,以防止我的代码出现意外行为以及验证过程(这是在单元测试的基础上,我相信) -

java android unit-testing annotations android-studio

18
推荐指数
1
解决办法
6134
查看次数

Android UI 测试使用 Espresso + MockK 在模拟器上使用 SIGSEGV 崩溃,在物理设备上很好

我刚刚开始使用MockK在基于 MVP 的应用程序中模拟所有存储库/服务逻辑以进行 UI 测试。

我有一些运行登录活动的 UI 测试,其中 Espresso 输入登录名和密码,并使用 MockK 我可以伪造登录失败与否的各种情况。

所有服务和存储库都是标准的 Kotlin 对象,所以我使用mockkobjectevery/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 mocking kotlin android-espresso mockk

13
推荐指数
1
解决办法
971
查看次数

Android Studio Designer预览未显示正确的尺寸

我对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上看不到同样的东西呢?

谢谢您的帮助 !

layout android dimensions xamarin android-studio

11
推荐指数
0
解决办法
1307
查看次数

Android上是否有任何类型的粒子发射器,如iOS CAEmitterLayer用于圆形发射器?

到目前为止,我的问题很难解决.

我应该和我的同事一起开发一个Android应用程序,它在iOS上做同样的事情.

在开发结束时,我们应该提供两个做同样事情并且看起来很相似的应用程序(可以放心,没有像iOS指南那样强制在Android上使用,反之亦然),这样体验就是一样的,身临其境.

提供的顶级功能之一是一个漂亮的白色空圆圈动画,在圆圈内发出雪状粒子.圆圈可以通过滚动或简单的弹跳/滑动动画来移动.

因此,想象一个带有白色边框的圆圈和白色颗粒离开那个白色的膜.所有这些粒子都被吸引到中心,它们的速度基础是变化的(但没有加速!).假设最快的粒子在到达中心之前"死亡".可以通过设置终身和速度轻松设置的东西.

我的伙伴,像我这样的大三学生,正在使用iOS'CAEmitterLayer,她在一两天内获得的结果非常华丽,非常接近我们应该达到的目标.

在我身边,我真的很挣扎.像她一样,我对任何动画和UI/UX都没有任何经验.在Android上寻找粒子生成器/发射器时,我偶然发现了这个漂亮的库:https://github.com/plattysoft/Leonids,它似乎可以提供我想要的东西.

但是我使用这个库有一些未解决的问题:

  1. 我不能或不知道我是否可以将发射器放在一个圆圈内;
  2. 我相信,如果连接发射器的圆圈正在移动(滚动/动画),那么粒子很可能不会随着圆圈移动;

正如我所说,我的iOS同事解决了这些问题.即使是动人的部分:我们正在和我们的经理谈话,他们告诉我们"如果圆圈移动怎么办?" 她立刻在我们面前试了一下.我被吹走了......

她告诉我,我应该寻找一种方法将我的粒子包含在一个容器内(有意义^^),并且我的圆形视图应该用图层剪裁,这样粒子就不会离开圆圈,特别是如果整个东西都在移动.

这是我通过前面提到的Android库实现的目标:

  1. 我可以发射粒子,定义它们的形状,它们的比例/大小,它们的速度和一定的发射角度;
  2. 我可以将粒子发射器连接到视图.它将使用视图X&Y坐标发出的粒子,但有问题的基于XML的圆圈绘制这里是它包含一个内部基于正方形的视图(带heightwidth)和奇怪的原因,我的圈画上面说基于平方的观点.

我希望我能找到另一个图书馆,但如果当前的图书馆正在运作,为什么不呢?试试我的运气^^

谢谢您的帮助 !

animation android ios particle-system caemitterlayer

11
推荐指数
1
解决办法
982
查看次数

具有自定义对象的JavaFX自定义单元工厂

我试图根据自ListView定义Cell列表定制自定义objects.

自定义对象是调用的类名Message,其中包含消息内容,收件人,时间戳状态(读取,发送等)的几个字段.

看了这个问题:使用FXML在JavaFX中自定义ListView我已经成功:

  1. 创建了一个带有自定义单元格的ListView,其中单元格设计在FXML文件中定义;
  2. 关联控制器,以便每个单元格数据可以用集合的当前项填充;

但是,我无法链接两者:我似乎无法找到一种方法,以便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)

java listview javafx custom-cell

11
推荐指数
1
解决办法
1万
查看次数

libphonenumber - 在不知道国家代码的情况下格式化电话号码

我从看起来很棒的图书馆听到了很多好消息,但我发现自己处于一种微妙的境地。

这是我工作过的第一个项目,我应该将电话号码存储在数据库中。

我已经阅读了一些关于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

如果最终用户向我的应用提供不以 开头的电话号码,我应该/可以做什么+?如果出现这种情况,我无法相信我是唯一的人。

谢谢您的帮助 !

java libphonenumber

11
推荐指数
1
解决办法
1万
查看次数

同时使用MediaPlayer播放多首歌曲:只有一首真正在播放

我需要帮助同时播放多个音轨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:所有三个玩家都在说他们正在玩,但只有一个可以听到......!

为什么要改变?为什么之后停止工作一次呢?

注意:

  • 音频文件具有相同的持续时间,大约约15分钟 …

audio multithreading android android-mediaplayer xamarin

9
推荐指数
2
解决办法
1万
查看次数

RecyclerView&SnapHelper - >获取快照/目标视图

我最近开始使用SnapHelper里面提供的内容Support Library v24,以便RecyclerViewGoogle 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将是一个居中的.


这是我到目前为止尝试的解决方案.

  1. 当滚动状态设置为时,我尝试使用相同的计算RecyclerView.SCROLL_STATE_SETTLING.不幸的是,findVisiblePosition当滚动不是空闲时从适配器调用方法是一个坏主意:根据滚动速度,当调用这些所谓的方法时,可见项目在滚动完成时可能不完全相同.实际上它会告诉我在通话时哪些物品是可见的.这完全有道理,但我需要尝试找出...

  2. 我尝试扩展,LinearSnapHelper以便在onFling(...)调用时我可以使用findSnapView(...)获取将被捕捉的视图,或者使用findTargetSnapPosition(...)希望告诉我滚动完成时哪个视图居中;

  3. 当滚动状态是时RecyclerView.SCROLL_STATE_SETTLING,我也尝试过使用findSnapView(...)

在所有这些解决方案中,没有一个通过多次测试(尝试不同的滑动强度和速度).有些人在一些情况下做对了,但在不同情况下弄错了,因此解决方案无法使用.

看了看之后,LinearSnapHelper我想我开始明白了,不知何故,在滑动之后,这个类计算总滚动并在滚动完成之前多次必要时捕捉视图(滚动距离的数量)因此知道哪个视图将会是最后拍摄的视图 ......除非我把它弄错了因为拍摄不对中?

无论如何,我的主要问题是:无论速度和力度如何 …

android android-recyclerview

9
推荐指数
2
解决办法
5685
查看次数

LifecycleOwner: Fragment (self) 和 Fragment#viewLifecycle 的区别

使用Android XAndroid Architecture Components,即以下...

  • 导航
  • 生命周期
  • 视图模型

... 使 Android 开发变得更加容易,以获得更好、更稳定的应用程序。

当对 a使用ViewModel公开LiveDatas 时Fragment,目前有两个LifecycleOwners可用于oberve

  1. Fragment本身或
  2. Fragment的财产mViewLifecycleOwner

到目前为止,我一直并且专门将sFragment本身用于任何和所有LiveDataViewModels公开的内容。

由于我喜欢通过频繁升级到最新的 alpha 和 beta来生活在边缘,我最近升级到:

  • 导航ktx版本2.2.0-rc01
  • 活动ktx版本1.1.0-rc01
  • 片段 ktx 版本1.2.0-rc01
  • 生命周期 ktx 版本2.2.0-rc01

幸运的是,在这个日期(2019 年 11 月 1 日),所有可用的候选版本都可用

这导致在旧的 Java 代码中警告我:

在此处输入图片说明

为什么实际上有两个LifecycleOwners

在设置 Fragment …

android android-lifecycle android-fragments android-architecture-components androidx

8
推荐指数
1
解决办法
3774
查看次数

Flutter:使用带有继承的 JsonSerialized 和干净的架构

我试图通过这个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)替代,这显然违反了这里的原则。

我该如何解决这个问题?谢谢您的帮助!

json dart flutter clean-architecture json-serializable

6
推荐指数
0
解决办法
560
查看次数