我试图了解在导航选项卡中使用片段时如何保留片段视图状态.在我的努力中,我遇到了两个问题,我找不到任何适当的解决方案.
我有两个标签,Tab1和Tab2.Tab1的布局由定义FragmentA,Tab2的布局由定义FragmentB.我按照这里给出的方法(编辑:文档已经改变,因为这个问题被问到).
第一个问题:即使我的视图有ID,当重新连接片段(在制表符切换旋转之后)时,它们的状态也不会完全恢复.特别是:一个EditText带有ID 不确实保存其输入的文字,但它并不能挽救它的启用状态.此外,如果启用或禁用按钮,即使它们具有ID,也不会保存.我发现了这个问题的两种可能的解决方法:
hide()/show()而不是attach()/detach()切换标签时.onPause(),将当前片段视图状态保存View在片段via 的实例变量中getView().在onCreateView(Bundle savedInstanceState)检查该字段不为空,如果是这样的情况下,返回此字段的值.这个解决方案看起来很糟糕,我被告知它可能也会在我的应用程序中引入内存泄漏.第二个问题:考虑以下用户交互:用户在Tab1上启动并进行一些更改,使Tab1的视图状态处于与其默认状态不同的状态(我们希望片段通过制表符和设备倾斜来保存此视图状态) .然后用户转到Tab2.然后用户倾斜她/他的设备(仍然在Tab2).然后用户切换到Tab1(在新的屏幕方向).现在,问题是:当用户最初从Tab1切换到Tab2时,片段被分离,从而丢弃其视图(即使片段实例仍然存在).当用户然后倾斜设备时,活动 - 从而与之相关FragmentA并且FragmentB与之相关联 - 被破坏.由于FragmentA此时不再有视图(记住:它已被分离),我们无法在调用期间保存其视图元素的状态(例如,启用/禁用了哪些按钮)FragmentA.onSaveInstanceState(Bundle savedInstanceState).在这种情况下如何恢复片段视图状态?唯一可行的解决方案是将每个视图元素的不同状态标志保存为SharedPreferences吗?对于这样的"日常工作"来说,这似乎太复杂了.
请考虑以下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) 我已经实现了一个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如果身份验证成功,则将其设置为我自己的自定义实现()的实例.此实现添加了额外的身份验证和授权数据,我希望稍后在后续过滤器和我的资源方法中访问这些数据. …
我正在尝试同时运行 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)