小编Jan*_*ken的帖子

Android导航标签:恢复片段视图状态

我试图了解在导航选项卡中使用片段时如何保留片段视图状态.在我的努力中,我遇到了两个问题,我找不到任何适当的解决方案.

我有两个标签,Tab1和Tab2.Tab1的布局由定义FragmentA,Tab2的布局由定义FragmentB.我按照这里给出的方法(编辑:文档已经改变,因为这个问题被问到).

第一个问题:即使我的视图有ID,当重新连接片段(在制表符切换旋转之后)时,它们的状态也不会完全恢复.特别是:一个EditText带有ID 确实保存其输入的文字,但它并不能挽救它的启用状态.此外,如果启用或禁用按钮,即使它们具有ID,也不会保存.我发现了这个问题的两种可能的解决方法:

  1. 使用hide()/show()而不是attach()/detach()切换标签时.
  2. in onPause(),将当前片段视图状态保存View在片段via 的实例变量中getView().在onCreateView(Bundle savedInstanceState)检查该字段不为空,如果是这样的情况下,返回此字段的值.这个解决方案看起来很糟糕,我被告知它可能也会在我的应用程序中引入内存泄漏.

第二个问题:考虑以下用户交互:用户在Tab1上启动并进行一些更改,使Tab1的视图状态处于与其默认状态不同的状态(我们希望片段通过制表符和设备倾斜来保存此视图状态) .然后用户转到Tab2.然后用户倾斜她/他的设备(仍然在Tab2).然后用户切换到Tab1(在新的屏幕方向).现在,问题是:当用户最初从Tab1切换到Tab2时,片段被分离,从而丢弃其视图(即使片段实例仍然存在).当用户然后倾斜设备时,活动 - 从而与之相关FragmentA并且FragmentB与之相关联 - 被破坏.由于FragmentA此时不再有视图(记住:它已被分离),我们无法在调用期间保存其视图元素的状态(例如,启用/禁用了哪些按钮)FragmentA.onSaveInstanceState(Bundle savedInstanceState).在这种情况下如何恢复片段视图状态?唯一可行的解​​决方案是将每个视图元素的不同状态标志保存为SharedPreferences吗?对于这样的"日常工作"来说,这似乎太复杂了.

android-fragments android-tabs

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

Java:为什么即使允许显式正数?

请考虑以下Java代码:

int result = 0;
for (int i = 0; i < 10; i++) {
    result += 1;
}
Run Code Online (Sandbox Code Playgroud)

循环执行10次迭代,因此result在循环终止时保持值10.

现在考虑以下几乎相同的代码:

int result = 0;
for (int i = 0; i < 10; i++) {
    result =+ 1;
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是我们现在用有效的+=运算符替换=+.后者可能看起来像一个运算符,但事实上并非如此(参见例如Oracles对Java运算符的介绍).但是,在此更改后代码仍然可以正常编译.循环显然仍然执行10次迭代,但result将是1而不是10.

这里发生的是,+部分=+联营公司与1替代的=,因此代码基本上是一样的:

int result = 0;
for (int i = 0; i < 10; i++) {
    result = +1;
}
Run Code Online (Sandbox Code Playgroud)

这又与以下相同:

int result …
Run Code Online (Sandbox Code Playgroud)

java operators

4
推荐指数
1
解决办法
92
查看次数

JAX-RS:自定义SecurityContext在注入资源方法时具有意外类型

我已经实现了一个ContainerRequestFilter执行基于JWT的身份验证:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        AuthenticationResult authResult = ...
        if (authResult.isSuccessful()) {
            // Client successfully authenticated.
            // Now update the security context to be the augmented security context that contains information read from the JWT.
            requestContext.setSecurityContext(new JwtSecurityContect(...));
        } else {
            // Client provided no or an invalid authentication token.
            // Deny request by sending a 401 response.
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我更新了SecurityContext请求,JwtSecurityContext如果身份验证成功,则将其设置为我自己的自定义实现()的实例.此实现添加了额外的身份验证和授权数据,我希望稍后在后续过滤器和我的资源方法中访问这些数据. …

java authentication authorization jax-rs jersey

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

Executor 执行两次

我正在尝试同时运行 2 个线程以实现多线程,并且我的程序正在运行,但我怀疑为什么我的程序打印到标准输出两次。

这是我的代码库:

public class SimpleExec {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(5);
        CountDownLatch countDownLatch6 = new CountDownLatch(5);
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        System.out.println("start" + LocalDateTime.now());
        executorService.execute(new MyThread("first ", countDownLatch));
        executorService.execute(new MyThread("Second", countDownLatch6));

        try {
            countDownLatch.await();
            countDownLatch6.await();
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        System.out.println("end" + LocalDateTime.now());
        executorService.shutdown();

    }
}

class MyThread implements Runnable {
    String name;
    CountDownLatch cdl;

    public MyThread(String name, CountDownLatch cdl) {
        this.cdl = cdl;
        this.name = name;
        new Thread(this).start();
    }

    public …
Run Code Online (Sandbox Code Playgroud)

java multithreading executorservice

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