小编Ben*_*ell的帖子

嵌套片段 - IllegalStateException"onSaveInstanceState后无法执行此操作"

背景

Android中的异步回调

尝试在Android上以可靠的方式执行异步操作是不必要的错综复杂的,即AsyncTask在概念上是否真的有缺陷,或者我只是缺少某些东西?

现在,这是在引入Fragments之前的全部内容.随着Fragments的引入,onRetainNonConfigurationInstance()已被弃用.因此,最新的Google宽恕黑客是使用持久的非UI片段,当发生配置更改时(即旋转屏幕,更改语言设置等),它会从您的Activity中附加/分离.

示例:https: //code.google.com/p/android/issues/detail?id = 23096#c4

IllegalStateException - 无法在onSaveInstanceState之后执行此操作

从理论上讲,上面的黑客可以让你绕过可怕的:

IllegalStateException - "Can not perform this action after onSaveInstanceState"
Run Code Online (Sandbox Code Playgroud)

因为持久的非UI片段将接收onViewStateRestored()(或者onResume)和onSaveInstanceState()(或者onPause)的回调.因此,您可以判断实例状态何时被保存/恢复.这是一个很简单的代码,但是利用这些知识,您可以排队异步回调,直到活动的FragmentManager在执行它们之前将其mStateSaved变量设置为false.

mStateSaved是最终负责触发此异常的变量.

private void checkStateLoss() {
    if (mStateSaved) {
        throw new IllegalStateException(
                "Can not perform this action after onSaveInstanceState");
    }
    if (mNoTransactionsBecause != null) {
        throw new IllegalStateException(
                "Can not perform this action inside of " + mNoTransactionsBecause);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以从理论上讲,现在你知道什么时候执行片段事务是安全的,因此你可以避免可怕的IllegalStateException.

错误!

嵌套片段

上面的解决方案仅适用于Activity的FragmentManager.片段本身也有一个子片段管理器,用于嵌套片段.遗憾的是,子片段管理器根本不与Activity的片段管理器保持同步.因此,虽然活动的片段管理器是最新的,并且始终具有正确的mStateSaved; 儿童片段不这么认为,并且会在不适当的时候愉快地抛出可怕的IllegalStateException.

现在,如果您查看了支持库中的Fragment.java和FragmentManager.java,您将不会感到惊讶的是,所有与片段有关的内容都容易出错.设计和代码质量是......啊,有问题.你喜欢布尔吗?

mHasMenu = false
mHidden = false
mInLayout = …
Run Code Online (Sandbox Code Playgroud)

java android illegalstateexception

14
推荐指数
1
解决办法
4847
查看次数

Bash subshel​​l errexit语义

我为我的shell脚本启用了errexit(和pipefail),因为这是我通常想要的行为.但是,偶尔我想捕获错误并以特定方式处理它们.

我知道对包含布尔运算符的命令禁用errexit或者将其用作条件(如果,等等)

例如

git push && true
echo "Pushed: $?"
Run Code Online (Sandbox Code Playgroud)

将在成功时回应"推动:0",或者在失败时回应"推动:别的 ".

但是,如果我想让子shell启用errexit,那么我希望捕获此子shell的退出代码?

例如:

#!/usr/bin/env bash
set -o errexit

(
    git push
    echo "Hai"
) && true

echo "Did it work: $?"
Run Code Online (Sandbox Code Playgroud)

问题是,bash看到了&& boolean运算符并为子shell禁用了errexit.这意味着"海"总是回声.那是不可取的.

如何在这个子shell中启用errexit,并捕获子shell的状态代码,而不让出口代码终止外壳而不必在整个地方不断启用和禁用errexit

更新

我有一种强烈的感觉,解决方案是使用陷阱并捕获退出信号.在我自我回答之前,请随意提供答案.

bash

10
推荐指数
1
解决办法
3108
查看次数

核心数据属性更改为nil(ARC相关?)

我有一些核心数据功能正常工作,直到最近(看似无关)一些更改.现在我遇到的问题是属于特定NSManagedObject子类实例的所有属性突然返回nil.

假设我的NSManagedObject子类名为Foo,它只有一个名为value的属性.一旦我意识到价值以某种方式变为零,我去设置以下类别来监控价值变化.

@implementation Foo (Debug)

- (void)setValue:(NSDate *)value
{
    [self willChangeValueForKey:@"value"];
    [self setPrimitiveValue:value forKey:@"value"];     
    [self didChangeValueForKey:@"value"];
}

- (NSDate *)value
{
    [self willAccessValueForKey:@"value"];
    NSDate *value = [self primitiveValueForKey:@"value"];
    [self didAccessValueForKey:@"value"];

    return value;
}

@end
Run Code Online (Sandbox Code Playgroud)

setValue:为我的对象调用,传入的参数是一个非零NSDate.然后检索该值(在另一种方法中).正确检索指定的相同值.

但是,当另一个方法尝试读取值时,将调用值访问器并由primitiveValueForKey:返回nil值.

在两个读取之间,setValue:未被调用,并且Foo对象本身仍然有效(非零).事实上,在任何Core Data对象或整个上下文的两次读取之间不会执行其他Core Data操作.

我们在项目中使用ARC.有可能ARC在某种程度上搞乱了我的核心数据变量并取消分配它们吗?如果是这样,有人有任何调试ARC解除分配的建议吗?或者更好的是,有没有人知道确保ARC不释放我的变量的方法.

这甚至可能与ARC无关,但是对于发生的事情我有点不知所措.任何建议将非常感谢.

core-data objective-c automatic-ref-counting

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

关于短路的C#按位操作 - 为什么要转换为int?

short BitwiseTest(short value)
{
    short test1 = ((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return (test1 | test2);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码应该是一个(低效)示例,它在C#中交换短(带符号的16位整数)的字节序.

但是上面的代码不会编译,因为C#在以下两行中隐式地从short转换为int:

第一种情况:

short test1 = ((value >> 8) & 0xFF);
Run Code Online (Sandbox Code Playgroud)

第二种情况:

return (test1 | test2);
Run Code Online (Sandbox Code Playgroud)

为什么要进行演员表演?我是否可以通过简短的回归来实现预期的结果?像这样:

short BitwiseTest2(short value)
{
    short test1 = (short)((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return ((short)(test1 | test2));
}
Run Code Online (Sandbox Code Playgroud)

如果不是为什么不呢?

请注意,我确实理解为什么C#在执行左位移时将短路转换为整数,因此分配了test2变量.

c# syntax bitwise-operators implicit-cast

7
推荐指数
1
解决办法
5060
查看次数

打开 High Sierra 系统日志文件 (tracev3)

如何查看 High Sierra 系统日志文件?具体来说,我想从恢复中或远程执行此操作。

\n\n

在恢复中,log collect 给出:

\n\n
\n

\xe2\x80\x9clog:收集 LiveData 失败:没有这样的文件或目录 (2)\xe2\x80\x9d

\n
\n\n

log show根据其文档,即使在正常启动的系统上,它似乎也不起作用,例如

\n\n

log show --file Persist/00000000000000eb.tracev3给出:

\n\n
\n

日志:无法打开 Tracev3 日志文件:指定的 URL 未引用有效的日志存档

\n
\n\n

尽管文档指出:

\n\n
\n

--file file 显示给定 .tracev3 文件中存储的事件。为了进行解码,该文件必须包含在有效的 .logarchive 包中,或者是系统日志目录的一部分。

\n
\n\n

这似乎意味着 .tracev3 不需要位于日志存档中,如果它们 \xe2\x80\x99re 在系统日志目录中。

\n

macos logging macos-high-sierra

5
推荐指数
1
解决办法
1685
查看次数

为什么我的Android gradle变体定制无效?

1-为什么如下:

android.buildVariants.each { variant ->
    ... my code
}
Run Code Online (Sandbox Code Playgroud)

给我以下错误?

无法在com.android.build.gradle.AppExtension_Decorated@1bf6bde6上找到属性"buildVariants".

2-为什么以下静默不执行"...我的代码"?

android.applicationVariants.each { variant ->
    ... my code
}
Run Code Online (Sandbox Code Playgroud)

android gradle android-studio

3
推荐指数
1
解决办法
2360
查看次数

如何用jar替换gradle模块依赖项?

我有一个多项目构建,一个或多个子项目对损坏的模块有依赖性。我想用对本地JAR文件的依赖关系替换模块依赖关系。

我已经尝试了以下方法(我本来没想到会起作用),但是除此之外,还有些茫然:

configurations.all {
    resolutionStrategy {
        failOnVersionConflict()

        eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == "com.android.support" && details.requested.name == "support-v4") {
                details.useTarget("lib/android-support-v4-fixed.jar")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何用对文件(即JAR)的依赖关系替换子项目中的模块依赖关系?

java gradle

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