小编Tal*_*dar的帖子

如何从HttpServerExchange获取请求正文?

我创建了一个Undertow服务器和一个处理程序来记录请求.我在检索请求体时遇到问题HttpServerExchange.

LoggingHandler课堂上,我的身体没有问题.但在TestEndpoint身体空洞.

如果我删除了检索请求体的行,LoggingHandler则会填充正文TestEndpoint.

有谁知道这样做的方法?

我的服务器类:

package com.undertow.server;

import com.undertow.server.endpoints.TestEndpoint;

import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
import org.jboss.resteasy.spi.ResteasyDeployment;

import io.undertow.Undertow;
import io.undertow.Undertow.Builder;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.BlockingHandler;
import io.undertow.servlet.api.DeploymentInfo;

public class UndertowServer {

    private UndertowJaxrsServer server;

    public UndertowServer() {
        this.server = new UndertowJaxrsServer();
    }

    public void start() {
        Builder builder = Undertow.builder().addHttpListener(8000, "0.0.0.0");
        this.server.start(builder);
        this.configureEndpoints();
    }

    private void configureEndpoints() {
        ResteasyDeployment deployment = new ResteasyDeployment();
        deployment.getActualResourceClasses().add(TestEndpoint.class);

        DeploymentInfo deploymentInfo = this.server.undertowDeployment(deployment) //
                .setClassLoader(ClassLoader.getSystemClassLoader()).setContextPath("/gateway/") //
                .setDeploymentName("gateway.war"); …
Run Code Online (Sandbox Code Playgroud)

java rest httphandler resteasy undertow

9
推荐指数
1
解决办法
1543
查看次数

垃圾收集器没有像在 Android 应用程序中那样释放“垃圾内存”

你好!

我是一名初级 Java 和 Android 开发人员,最近在处理我的应用程序的内存管理方面遇到了麻烦。我将把这篇文章分成几个部分,以使其更清晰易读。


我的应用程序的简要说明

这是一个由几个阶段(级别)组成的游戏。每个阶段都有一个玩家的起点和一个出口,引导玩家进入下一个阶段。每个阶段都有自己的一套障碍。目前,当玩家到达最后阶段(我目前只创建了 4 个)时,他/她会自动回到第一阶段(1 级)。

一个名为GameObject(扩展Android.View)的抽象类定义了玩家和游戏中存在的所有其他对象(障碍物等)的基本结构和行为。所有对象(本质上是视图)都绘制在我创建的自定义视图中(扩展 FrameLayout)。游戏逻辑和游戏循环由一个侧线程(gameThread)处理。这些阶段是通过从 xml 文件中检索元数据来创建的。

问题

除了我的代码中所有可能的内存泄漏(我一直在努力寻找和解决所有这些问题)之外,还有一个与垃圾收集器发生相关的奇怪现象。我将使用图像,而不是用文字来描述它并冒着让您感到困惑的风险。孔子说:“千言万语”。好吧,在这种情况下,我刚刚让您免于阅读 150,000 个单词,因为我下面的 GIF 有 150 帧。

第一次加载时的第 1 阶段。 该应用程序的总内存分配为 85mb。 第二次加载时的第 1 阶段。 该应用程序的总内存分配为 130mb。 在我强制执行 2 次垃圾回收(使用 Android Profiler)后,内存回到 85mb。

描述:第一张图片代表我的应用程序在第一次加载“stage 1”时的内存使用情况。第二个图像 (GIF) 首先表示第二次加载“阶段 1”时我的应用程序的内存使用时间线(这种情况发生,如前所述,当玩家击败最后一个阶段时),然后是四个强制启动的垃圾收集由我。

您可能已经注意到,这两种情况在内存使用方面存在巨大差异(几乎 50MB)。第一次加载“第一阶段”时,当游戏开始时,应用程序使用 85MB 内存。第二次加载同一个stage的时候,稍晚一点,内存使用量已经是130MB了!这可能是由于我的一些糟糕的编码,因此我不在这里。你有没有注意到,在我强行执行了 2 次(实际上是 4 次,但只有前 2 次重要)垃圾收集之后,内存使用情况又回到了它的“正常状态”(与第一次加载舞台时的内存使用情况相同)?这就是我所说的奇怪现象

问题

如果垃圾收集器应该从不再被引用的内存对象中删除(或者至少只有弱引用),为什么你在上面看到的“垃圾内存”只有在我强行调用GC和不是关于GC的正常执行?我的意思是,如果我手动启动的垃圾收集可以删除这个“thrash”,那么正常的GC执行也可以删除它。为什么没有发生?

我什至尝试在切换阶段时调用System.gc(),但是,即使垃圾收集发生这种情况,这种“颠簸”内存不会像我手动执行GC那样被删除。我是否遗漏了一些关于垃圾收集器如何工作或 Android 如何实现它的重要信息?

最后的考虑

我花了几天时间搜索、研究和修改我的代码,但我找不到为什么会这样。StackOverflow 是我最后的选择。谢谢!

注意:我打算发布一些可能与我的应用程序源代码相关的部分,但由于问题已经太长了,我将在这里停止。如果您觉得需要检查某些代码,请告诉我,我将编辑此问题。

我已经读过: …

java performance android garbage-collection memory-leaks

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

calendar.getDisplayName 返回错误的日期

下面是我的程序,当我输入相关的月份、日期和年份时,它返回错误的日期名称。

我在这里缺少什么?

我的程序

import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;

public class TimeTest {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String month = in.next();
        String day = in.next();
        String year = in.next();

        System.out.println(getDay(day, month, year));
    }

    private static String getDay(String day, String month, String year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
        return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());

    }
}      
Run Code Online (Sandbox Code Playgroud)


输出:

09
24
2018
Wednesday       
Run Code Online (Sandbox Code Playgroud)

它应该返回“星期一”,因为那是当天。

java calendar

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

是否在lambda表达式中实例化了一个类?

我有以下方法调用,其中传递了一个lambda表达式。这里是否隐式实例化了一个类?

printStudents(
    roster,
    (Student s) -> s.getGender() == Student.Sex.MALE
        && s.getAge() >= 18
        && s.getAge() <= 25
);
Run Code Online (Sandbox Code Playgroud)

方法签名:

printStudents(List<Student> roster, CheckStudent checkstudet)
Run Code Online (Sandbox Code Playgroud)


interface CheckStudent {
    boolean test(Student s);
}
Run Code Online (Sandbox Code Playgroud)

编辑

你们中有些人建议我重构代码,但是出现了同样的问题。

CheckStudent checkStudent = (Student s) -> s.getGender() == Student.Sex.MALE && s.getAge() >= 18 && s.getAge() <= 25;
Run Code Online (Sandbox Code Playgroud)

是否Student在作业的右侧实例化了一个类(我不是指class )?

java lambda functional-interface

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

Java的main()方法可以声明为final吗?

在Java中,该main()方法的声明是有效的吗?我们经常使用 public static void main(String[] arr){},但我想知道的是:该main()方法可以被声明为final吗?

final public static void main(String[] arr) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

java

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

处置可观察量

这个问题与Android和生命周期有关。以前,我会有一系列主题并在创作时订阅它们。

销毁后,我会将所有主题标记为完整,假设它处理了所有订阅者。

在 Android Studio 3.1 中,我会收到针对“未使用”的任何订阅者的警告。解决方案是将它们添加到“完全一次性”中,然后我在销毁时进行处理。

我需要“复合一次性”来在销毁时正确取消请求吗?我之前将主题标记为完整的方法有什么作用吗?在这种情况下有必要吗?

作为代码示例:

val observable: PublishSubject<Int> = PublishSubject.create()
val disposable = observable.subscribe { /* subscription */ }

fun onDestroy() {
    observable.onComplete() // is this line necessary or helpful?
    disposable.dispose()
}
Run Code Online (Sandbox Code Playgroud)

android rx-java2 rx-kotlin2

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

多态性:从超类变量调用子类方法

在Java中,当要执行一个方法时,首先在对象的真实类(定义对象的真实类型)中搜索它的声明。如果没有找到,则检查超类。如果在那里也找不到,则检查下一个父类,依此类推。但是,请看下面的示例:

   SuperClass s = new SubClass(list of parameter);
   s.someMethodExistOnlyInSubClass();
Run Code Online (Sandbox Code Playgroud)

这会给我一个编译时错误。我认为,如上所述,它会首先查找someMethodExistOnlyInSubClass()at SubClass,验证它是否存在,然后立即执行它。如果我使用该类型的变量SuperClass来引用某些参数的实例,SubClassSuperClass通过调用转到 的构造函数super(),并且该对象将在那里实例化。在这种情况下,剩下的参数到哪里去了?

java polymorphism

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

Firebase App Check 和 reCAPTCHA v3 企业集成:计费和令牌可重用性

我正在尝试使用 Firebase App Check 并以 reCAPTCHA v3 Enterprise 作为证明提供商来保护 Web 应用程序的自托管后端,但我对此设置的计费结构有一些疑问。

仅使用 reCAPTCHA v3 时,标准流程是使用 以编程方式在客户端调用质询grecaptcha.execute,检索令牌,然后将其发送到后端。随后,后端通过向 reCAPTCHA 服务器发出 API 请求来验证令牌。我对 reCAPTCHA Enterprise 定价页面的理解是,每次在后端验证令牌时我都会付费。

相比之下,Firebase App Check 的流程似乎略有不同。在这里,客户端通过 Firebase App Check 与 reCAPTCHA v3 交互,并接收令牌形式的“证明”。然后,客户端将此令牌发送到我的后端,我的后端通过向 Firebase 服务器发出请求来验证令牌的有效性。此外,Firebase App Check 令牌具有可配置的过期时间,并且可以重复使用,并且可以选择启用重播保护。

鉴于此,我不清楚 Firebase App Check 与 reCAPTCHA v3 集成时的计费方式。具体来说,我想知道:

  1. 每次 Firebase App Check 颁发令牌时,还是仅当我在后端验证 Firebase App Check 颁发的令牌的有效性时,我都需要付费吗?
  2. 与不重复使用令牌的传统 reCAPTCHA v3 方法相比,在 Firebase App Check 中重复使用令牌的能力是否可能会降低成本?

任何对这些问题的见解将不胜感激。

recaptcha firebase recaptcha-v3 firebase-app-check

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