我们的应用程序SecurityException
从崩溃报告软件中获得了不同的报告.这是崩溃的堆栈跟踪:
java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@43fda840 (pid=17925) when registering receiver android.content.IIntentReceiver$Stub$Proxy@43fd9458
at android.os.Parcel.readException(Parcel.java:1431)
at android.os.Parcel.readException(Parcel.java:1385)
at android.app.ActivityManagerProxy.registerReceiver(ActivityManagerNative.java:2466)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1717)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1685)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1679)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:453)
at com.google.android.gms.analytics.q.v(Unknown Source)
at com.google.android.gms.analytics.r.cF(Unknown Source)
at com.google.android.gms.analytics.r.cH(Unknown Source)
at com.google.android.gms.analytics.s.cO(Unknown Source)
at com.google.android.gms.analytics.s.cP(Unknown Source)
at com.google.android.gms.analytics.s.d(Unknown Source)
at com.google.android.gms.analytics.s$e.run(Unknown Source)
at java.util.Timer$TimerImpl.run(Timer.java:284)
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪始终是相同的,除了唯一似乎改变的是它们android.app.ApplicationThreadProxy@41da9030 (pid=9103)
并且android.content.IIntentReceiver$Stub$Proxy@41ee0688
它们具有不同的数字(这个线程ID是什么?)
现在这个异常似乎与意图大小有关(参见以下链接)
这是唯一的原因吗?如果是这样,当代码似乎只来自google analytics
代码时,我的代码是如何导致的呢?我使用GA错了吗?除了制作一个跟踪器,我似乎没有做太多.
编辑
这就是我创建跟踪器的方式.singleton
我的应用程序对象中有一个跟踪器
Tracker appTracker;
synchronized Tracker getTracker()
{
GoogleAnalytics analytics …
Run Code Online (Sandbox Code Playgroud) android google-analytics android-intent google-play-services
我一直在阅读.NET4.5将带来的变化,在这篇博客文章中,我偶然发现了一些我既不知道也不理解的东西.
在谈到只读集合的实现时,Immo Landwerth说:
不幸的是,我们的类型系统不允许制作T协变类型,除非它没有将T作为输入的方法.因此,我们无法向IReadOnlyList添加IndexOf方法.我们认为,与不支持协方差相比,这是一个小小的牺牲.
从我明显有限的理解,似乎他说,为了使我们能够调用一个需要IReadOnlyList<Shape>
通过传入IReadOnlyList<Circle>
的IReadOnlyList<T>.IndexOf(T someShape)
方法,我们不能有一个方法.
我没有看到类型系统如何阻止它.谁能解释一下?
在编译我的应用程序时,我在所有生成的WhateverFragmentOrActivityBinding类上收到以下错误:
error: cannot find symbol
protected WhateverFragmentOrActivityBinding(DataBindingComponent _bindingComponent, View _root,
^
symbol: class DataBindingComponent
location: class WhateverFragmentOrActivityBinding
Run Code Online (Sandbox Code Playgroud)
该DataBindingComponent
级似乎没有产生.
看一下DataBindingComponent
我们看到的文档:
如果使用Dagger 2,开发人员应扩展此接口并将扩展接口注释为Component.
我确实使用Dagger 2,所以我怀疑这可能是相关的.我自己试图这样做,无济于事,无法在互联网上找到它.这就是我尝试过的:
@Component(dependencies = [AppComponent::class], modules = [(AppModule::class), (AndroidInjectionModule::class), (ActivityBuilderModule::class)])
interface BindingComponent : DataBindingComponent
Run Code Online (Sandbox Code Playgroud)
但是,从未生成DaggerBindingComponent类,因为找不到我已经拥有的符号错误.这似乎是鸡和鸡蛋的问题,所以我不相信这是我的问题的解决方案.
DataBindingComponent似乎负责处理BindingAdapters.我有一些自定义绑定适配器用于绑定ImageView src属性,但即使注释掉这些适配器也无济于事,所以我不确定它们是否相关.
我尝试完全从应用程序中删除Dagger,问题没有消失.不知道还有什么可以尝试
u_u
当使用NavigationView
带有DrawLayout
和ActionBar
,jetpack
提供了一些功能强大方便的方法来挂钩一切在一起,使这些项目更容易实现.
库中setupActionBarWithNavController
提供的方法NavigationUi
是一种扩展方法,用于添加汉堡包按钮以打开抽屉的活动,如果您覆盖onSupportNavigateUp:Boolean
活动navigateUp(drawLayout:DrawLayout, navController:NavController)
方法以调用方法,该方法会将汉堡包按钮更改为后退按钮并自动返回花哨的动画,超酷.
但是,这个方法似乎实现如下:
public static boolean navigateUp(@Nullable DrawerLayout drawerLayout,
@NonNull NavController navController) {
if (drawerLayout != null && navController.getCurrentDestination().getId()
== navController.getGraph().getStartDestination()) {
drawerLayout.openDrawer(GravityCompat.START);
return true;
} else {
return navController.navigateUp();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在此处看到的,此方法具有以下基本逻辑:
如果你不在navgraph的起始目的地,那么按钮是一个后退按钮,否则它是一个汉堡包按钮
这意味着只有起始目的地可以通过操作栏按钮打开绘图菜单,而所有其他目的地都有后退按钮,并且必须滑动才能打开绘图菜单.
为什么会这样?这似乎是android团队有意识的设计决定.在多个目的地有一个汉堡包按钮是不是不赞成吗?
我想有几个主要的分支,有一个汉堡包菜单和所有屏幕分支的那些有一个后退按钮.有没有办法实现多个NavGraphs
并将它们连接在一起NavigationView
?
u_u
navigation android android-actionbar navigation-drawer android-jetpack
介绍
我创建了一个DecimalTextBox UserControl
,它包含了我需要完成的一些十进制验证,因此我不需要每次都重新创建验证,而只需使用它UserControl
.DependencyProperties
根据Josh Smith的这篇文章,这个验证具有需要绑定的属性,因此我创建了所以我可以绑定它们.
问题
控件的验证表现得很奇怪.当我输入错误的值时TextBox
,它会显示为错误.但是,当我尝试在代码中更改值时,文本框中显示的值保持不变.
以下是我执行导致此错误的步骤(在此示例中1是无效值):
代码示例
我会在这里发布一些代码,如果你想要更多让我知道.
ValidationTestControl的XAML
<UserControl x:Class="WPFTestProject.ValidationTestControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:v="clr-namespace:WPFTestProject"
x:Name="ValidationTest"
Height="50" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="Type 'Banana' here: "></TextBlock>
<TextBox MinWidth="100">
<TextBox.Text>
<Binding ElementName="ValidationTest" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<v:NotBananaValidationRule>
<v:NotBananaValidationRule.NotWhatBinding>
<v:NotBananaBinding x:Name="NotBananaValidationBinding"></v:NotBananaBinding>
</v:NotBananaValidationRule.NotWhatBinding>
</v:NotBananaValidationRule>
</Binding.ValidationRules> …
Run Code Online (Sandbox Code Playgroud) 我有一个堆栈溢出错误,我很确定我没有任何类型的无限递归(至少我已经盯着错误几个小时了,我无法想象它的无限循环).
这是代码:
public decimal? Amount
{
get
{
if (!string.IsNullOrEmpty(_savedWork.Amount))
return decimal.Parse(_savedWork.Amount);
else
return null;
}
set
{
if (value.HasValue)
{
_savedWork.Amount = value.Value.ToString();
Percent = null;
}
else
_savedWork.Amount = "";
OnPropertyChanged("Amount");
}
}
Run Code Online (Sandbox Code Playgroud)
#Note我有一个以可以为空的十进制字符串的字符串,这就是我转换它的原因.请不要让我说明为什么我这样做.
这条线savedWork.Amount = value.Value.ToString()
是我得到错误的地方.
基本上我认为我的堆栈太小(或者我认为我的代码太大了).我基本上运行这个代码两次,它在一种形式下工作,但是当我制作另一种形式并将其放在那里时,我不认为这两种形式之间的区别在于倾斜堆栈.
有没有办法确定我做错了什么?我想知道代码的哪些部分占用太多或持续时间太长等.
我已经做了一些关于堆栈/堆如何工作的研究,我知道PerfMon.exe,但据我所知它只适用于堆.是否有类似的工具,我可以用于我的程序正在运行的堆栈?
我发现这个帖子大约有两个名为windbg和cdb的工具,但我找不到很多关于如何安装/使用它们的信息.这些工具是正确的方法吗?
或者,如果存在无限循环或某些事情会很棒.
这里是Amount属性请求的代码(由EntityFramework自动生成)正如我在评论中所说,步骤甚至没有到达这里.我确实认为我的堆栈限制正在达到.
public global::System.String Amount
{
get
{
return _Amount;
}
set
{
OnAmountChanging(value);
ReportPropertyChanging("Amount");
_Amount = StructuralObject.SetValidValue(value, true);
ReportPropertyChanged("Amount");
OnAmountChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
好的,Meta-Knight的回答告诉我,我确实有一个无限循环.我有一个事件处理程序订阅了DisplayTypeOfInvestment的PropertyChanged事件(Amount属性所属的类).处理程序看起来像这样: …
android ×3
c# ×3
wpf ×2
xaml ×2
.net-4.5 ×1
dagger-2 ×1
data-binding ×1
kotlin ×1
navigation ×1
type-systems ×1