小编Tim*_*mmm的帖子

为什么我会想要`setRetainInstance(false)`? - 或 - 处理设备旋转的正确方法

如果我错了,请纠正我.这是一个澄清问题,因为我没有看到它明确写在任何地方.

在Android 4中,您可以调用setRetainInstance(true)on Fragment以便在配置更改(这基本上意味着设备旋转)时,Fragment不会销毁java对象并且不会创建它的新实例.也就是说,保留了实例.

由于您不必处理和捆绑所有数据,因此它可以传递给新的(或)实例,只是再次进行非捆绑,因此这比Android 1-3更加理智且不那么令人愤怒.这基本上是你期望发生的事情,并且可以说它应该从一开始就如何起作用.onRetainNonConfigurationStateInstance()FragmentActivityActivity

通过setRetainInstance(true)视图也可以onCreateView()像您期望的那样在旋转时重新创建(被调用).我假设(未测试)资源解析(layoutvs layout-land)有效.

所以我的问题是双重的:

  1. Activities从一开始为什么不喜欢这个.
  2. 为什么这不是默认值?是否有过任何理由,你为什么会其实是想你Fragment被无谓破坏并重新创建的轮换?因为我想不到任何.

编辑

澄清我将如何做到:

class MyFragment extends Fragment
{
    // All the data.
    String mDataToDisplay;
    // etc.

    // All the views.
    TextView mViewToDisplayItIn;
    // etc.

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        mDataToDisplay = readFromSomeFileOrWhatever(); // Ignoring threading issues for now.
    }

    @Override
    public View onCreateView(LayoutInflater inflater, …
Run Code Online (Sandbox Code Playgroud)

lifecycle android rotation fragment android-activity

16
推荐指数
2
解决办法
3052
查看次数

去垃圾收集切片的部分?

如果我实现这样的队列......

package main

import(
    "fmt"
)

func PopFront(q *[]string) string {
    r := (*q)[0]
    *q = (*q)[1:len(*q)]
    return r
}

func PushBack(q *[]string, a string) {
    *q = append(*q, a)
}

func main() {
    q := make([]string, 0)

    PushBack(&q, "A")
    fmt.Println(q)
    PushBack(&q, "B")
    fmt.Println(q)
    PushBack(&q, "C")
    fmt.Println(q)

    PopFront(&q)
    fmt.Println(q)
    PopFront(&q)
    fmt.Println(q)      
}
Run Code Online (Sandbox Code Playgroud)

...我最终得到一个["A", "B", "C"]没有切片指向前两个元素的数组.由于切片的"开始"指针永远不会递减(AFAIK),因此永远不能访问这些元素.

Go的垃圾收集器是否足够智能以释放它们?

arrays garbage-collection go slice

16
推荐指数
2
解决办法
3361
查看次数

为什么Rust不能推断出Iterator :: sum的结果类型?

此代码有效:

fn main() {
    let a: i32 = (1i32..10).sum();
    let b = a.pow(2);
}
Run Code Online (Sandbox Code Playgroud)

如果我i32从中删除类型a,那么我收到此错误:

rustc 1.13.0 (2c6933acc 2016-11-07)
error: the type of this value must be known in this context
 --> <anon>:3:13
  |
5 |     let b = a.pow(2);
  |             ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

运行示例

我原以为Rust会(1i32..10)变成i32迭代器然后sum()知道返回一个i32.我错过了什么?

types type-inference rust

16
推荐指数
2
解决办法
1337
查看次数

将nohup的stderr重定向到nohup.out

如何运行一个命令nohup,使两者的输出和错误保存到nohup.out?默认情况下,仅保存stdout并丢弃stderr.

bash shell stdout nohup stderr

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

如何在 Rust 中安全地将 float 转换为 int

如何安全地将浮点类型(例如f64)转换为整数类型(例如u64)?换句话说,我想转换数字,但前提是它实际上可以由目标类型表示。

我发现了几个不涵盖此内容且不重复的问题:

解决方案是不使用as- 执行饱和转换。也u64::try_from(f64)没有实施。

最接近的似乎是f64::to_int_unchecked()但不幸的是它不安全。您可以轻松检查前两个安全要求(不是 NaN 或无穷大),但第三个有点乏味:Be representable in the return type Int, after truncating off its fractional part。

我能想到的最好的办法就是使用将as其转换回f64并检查相等性,即

fn convert(x: f64) -> Option<u64> {
    let y = x as u64;
    if y as f64 == x {
        Some(y)
    } else {
        None
    }
}
Run Code Online (Sandbox Code Playgroud)

这是最好的选择吗?它在任何地方实施吗?

rust

15
推荐指数
1
解决办法
2816
查看次数

从QML网址获取路径

FileDialog给出一个QML url变量.theurl.toString()给出类似的东西file:///c:\foo\bar.txt.我怎么得到c:\foo\bar.txt?

我想以跨平台的方式做到这一点,理想情况下不依赖于正则表达式的黑客攻击.QUrl提供了一种path()方法,但我似乎无法从QML访问它.

url qt filedialog qml

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

如何使用Qt Quick Controls显示消息框?

QMessageBox::information()当用户希望使用Qt Quick Controls编写QML应用程序时,相当于什么?

qt qml qt-quick qtquick2

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

为什么setCharacteristicNotification()实际上没有启用通知?

所述BluetoothLeGatt的Android BLE例如包含以下代码:

public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
                                          boolean enabled) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

    // This is specific to Heart Rate Measurement.
    if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(descriptor);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题基本上是,为什么标记的代码特定于心率测量?似乎具有客户端特征配置描述符(CCCD)特性是控制特征通知的标准方法,那么为什么不注意setCharacteristicNotification()写入呢?既然它不这样做,setCharacteristicNotification()实际上做了什么?

我对BLE很新,在互联网上没有任何解释,并不认为你已经理解了这一切!所以不要以为我知道什么是CCCD或其他什么!很难找到CCCD甚至代表什么!

编辑:另请参阅此答案,该答案支持我对CCCD的理解(并且让我继续想知道为什么你必须在Android中手动写入它们,当有一个看起来应该为你这样做的功能时):https:// devzone .nordicsemi.com/index.php文件/什么-做- CCCD均值

android bluetooth bluetooth-lowenergy gatt

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

额外详细的 ninja 调试输出

我的ninja构建似乎陷入了特定命令,但是如果我手动运行该命令,它会快速完成,没有任何问题。

有没有办法输出ninja更多的调试信息,这样ninja -v我就可以找出它挂起的原因?

ninja

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

调用 take 后如何继续使用迭代器?

我想从迭代器中收集一些项目,然后迭代其余的项目,如下所示:

let iterator = text.split_whitespace();
let first_ten_words = iterator.take(10).collect();

for word in iterator {
    // This should iterate over the remaining words.
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为take()消耗了迭代器。

显然我可以使用split_whitespace()两次,skip(10)但我认为这会将前 10 个单词分割两次,因此效率很低。

有更好的方法吗?

iterator rust

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