小编Tor*_*mer的帖子

Java 8传递方法作为参数

目前正在进入Java 8 lambda表达式和方法引用.

我想传递一个没有args且没有返回值的方法作为另一个方法的参数.这就是我这样做的方式:

public void one() {
    System.out.println("one()");
}

public void pass() {
    run(this::one);
}

public void run(final Function function) {
    function.call();
}

@FunctionalInterface
interface Function {
    void call();
}
Run Code Online (Sandbox Code Playgroud)

我知道有一组预定义功能接口在java.util.function诸如Function<T,R>,但我没有找到一个不带任何参数,而不是产生结果.

java lambda java-8 method-reference

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

连接Wifi时,CONNECTIVITY_ACTION意图收到两次

在我的应用程序中,我有一个BroadcastReceiver通过<receiver>标签作为组件启动,过滤android.net.conn.CONNECTIVITY_CHANGE意图.

我的目标只是知道何时建立了Wifi连接,所以我在做的onReceive()是:

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
    // Wifi is connected
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但在建立Wifi连接时,我似乎总是在大约一秒钟内得到两个相同的意图.我想看看任何信息,我可以从意图,获得ConnectivityManagerWifiManager,但我无法找到任何区别这两种意图.

查看日志,至少还有一个BroadcastReceiver也接收到两个相同的意图.

它运行在搭载Android 2.2的HTC Desire上

任何想法为什么我似乎在Wifi连接时获得"重复"的意图或两者之间的差异可能是什么?

android android-wifi android-broadcastreceiver

50
推荐指数
3
解决办法
5万
查看次数

可以覆盖/应用<include>标签中包含的布局样式吗?

我在我自己的布局中包含一个(内部)布局,如下所示:

<include android:id="@+id/twolinelistitem" 
    layout="@android:layout/simple_list_item_2"
    style="@style/TwoLineListItem"/>
Run Code Online (Sandbox Code Playgroud)

但风格不适用.这篇博文没有提到这应该有用,所以如果没有,我也没关系.

所以设置即背景的唯一方法是以编程方式?

这是一个有点相关的android问题

layout android include

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

正确的模式,以获取BroadcastReceiver中的WakeLock并在服务中释放它

即使经过大量的研究,我仍然不能完全确定我是如何实现WakeLock一个Service开始的方式BroadcastReceiver是正确的 - 即使它似乎工作正常.广播接收器从警报中获取发送给它的意图,所以首先从API文档开始AlarmManager:

如果您的警报接收器调用了Context.startService(),则手机可能会在启动所请求的服务之前休眠.为了防止这种情况,您的BroadcastReceiver和服务需要实施单独的唤醒锁定策略,以确保电话继续运行,直到服务可用.

所以,在onReceive()我做:

    Intent serviceIntent = new Intent(context, SomeService.class);
    context.startService(serviceIntent);

    if(SomeService.wakeLock == null) {
        PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        SomeService.wakeLock = powerManager.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK, 
                SomeService.WAKE_LOCK_TAG);
    }
    if(! SomeService.wakeLock.isHeld()) {
        SomeService.wakeLock.acquire();
    }
Run Code Online (Sandbox Code Playgroud)

在我做的服务中:

    try {
        // Do some work
    } finally {
        if(wakeLock != null) {
            if(wakeLock.isHeld()) {
                wakeLock.release();
            }
            wakeLock = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

SomeService.wakeLock字段是包私有,静态和易失性.

我不确定的是检查使用isHeld()- 是否真的告诉我是否WakeLock获得了,我是否需要进行检查?

service android broadcastreceiver wakelock

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

LocationManager返回带有当前时间戳的旧缓存"Wifi"位置

我想要获取当前位置.为此我实现了LocationListener并为网络和GPS提供商注册:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
Run Code Online (Sandbox Code Playgroud)

然后我阻塞30秒并使用传递给侦听器的第一个位置

onLocationChanged()
Run Code Online (Sandbox Code Playgroud)

精度为100米或更高的方法.

大部分时间这都很好.如果手机连接到某个Wifi网络,只需一秒钟即可获得正确的位置,精确度约为50米.如果没有Wifi但启用了GPS,那么获取位置当然需要一段时间.

然而,有时候,当连接到Wifi并获得当前位置时,会提供一些旧的(缓存?)之前的"Wifi"位置 - 它可能距离当前位置15分钟,距离15公里.问题是,那

location.getTime()
Run Code Online (Sandbox Code Playgroud)

返回当前时间 - 因此无法知道位置是否过时.

我想我必须实现一个更精细的解决方案 - 我只想知道为什么这些旧的"Wifi"位置具有当前时间戳而不是最初检索时的时间戳.

android location wifi

8
推荐指数
2
解决办法
5768
查看次数

在JTree节点中动态调整JTextField的大小

我正在使用带有一些JLabel和JTextField的JPanel作为JTree中的编辑器和渲染器.

用户可以单击任何JTextField并修改文本.一切正常.

我所缺少的是如何在用户输入时动态调整(增长)JTextField.

下面是一个说明问题的小样本程序.单击即"颜色"并输入一些其他字符.JTextField保持其大小,这是预期的,但我希望它增长和缩小以适应文本.

我尝试了不同的布局管理器,计算JTextField和JPanel的preferredSize,调用invalidate()以及JPanel和Tree等,但没有成功.

有任何想法吗?

import java.awt.Component;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;

public class Tree {

    public static void main(final String[] args) {
        new Tree().grow();
    }

    private void grow() {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JTree tree = new JTree();
        tree.setEditable(true);
        tree.setCellRenderer(new SomeTreeCellRenderer());
        tree.setCellEditor(new SomeTreeCellRenderer());

        frame.add(new JScrollPane(tree));

        frame.pack();
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private class SomeTreeCellRenderer extends AbstractCellEditor implements …
Run Code Online (Sandbox Code Playgroud)

java swing resize jtree jtextfield

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

使用PDT和MakeGood在Eclipse中使用PHPUnit测试

通常使用C和Java进行开发,我无法正确地在Eclipse中运行PHPUnit测试.

我在Ubuntu 15.04上安装了Eclipse Luna SR1(4.4.1)和PDT 3.4.0以及MakeGood 3.1.1.

首先我有错误

PHPUnit_Framework_TestCase class is not available. Fix...

在MakeGood中并尝试将PEAR [Environment]用户库添加到构建路径以反复修复此失败

Cannot create linked resource '/.org.eclipse.dltk.core.external.folders/.link1'

这可以通过添加来解决

<buildpathentry kind="con" path="org.eclipse.dltk.USER_LIBRARY/PEAR"/>
Run Code Online (Sandbox Code Playgroud)

.buildpathEclipse项目文件夹中.

然后运行测试失败了

Fatal error: Class 'PHPUnit_Framework_TestSuite' not found in [...] PHPUnitCollector.php on line 124

所以我创建了一个bootstrap.php:

<?php 

include_once '/usr/share/php/PHPUnit/Autoload.php';
include_once '/usr/share/php/PHP/Token/Stream/Autoload.php';
Run Code Online (Sandbox Code Playgroud)

和a phpunit.xml:

<phpunit bootstrap="bootstrap.php">
</phpunit>
Run Code Online (Sandbox Code Playgroud)

并在MakeGood项目属性中将它们设置为"预装脚本"和"XML配置文件".

它走得更远,但现在测试失败了

Fatal error: Class 'mysqli' not found

这就是我现在迷失的地方.

如果我在命令行上运行测试

phpunit --coverage-html coverage .

它们都运行良好,并且还创建了HTML覆盖率报告.

在PHP Executables下的Eclipse首选项中,我选择PHP CLI (Workspace Default)了Location /usr/bin/php …

php eclipse phpunit mysqli

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

@Stateless或@Singleton而不是静态助手类?

我正在维护一些运行良好的旧JEE代码但是正在使用一些静态辅助类,其中实体管理器从调用EJB传递方法,如下所示:

public class StaticHelper {

    public static void helpingOut(EntityManager entityManager, String value) {
        // i.e. insert value
    }
}
Run Code Online (Sandbox Code Playgroud)

由于这似乎不适合JEE并且对单元测试不好,我已经将这些助手转换为@StatelessEJB,如下所示:

@Stateless
public class StatelessHelper {

    @PersistenceContext(unitName="SuperUnit")
    private EntityManager entityManager;

    public void helpingOut(String value) {
        // i.e. insert value
    }
}
Run Code Online (Sandbox Code Playgroud)

就像我可以在使用CDI-Unit的调用EJB中注入一个模拟帮助器.

现在,根据负载,由这是不是在所有的问题我想说的容器中创建无状态帮手1-3实例,但无论如何,我想过一个@Singleton使用两种@ConcurrencyManagement(ConcurrencyManagementType.BEAN)@Lock(LockType.READ)使其多线程-不过这并未"似乎是一个好主意,因为EntityManager它不是线程安全的.或者这里解释的仍然适用?

"...容器序列化对每个有状态和无状态会话bean实例的调用.大多数容器将支持并发执行的会话bean的许多实例;但是,每个实例只能看到序列化的方法调用序列.因此,有状态或无状态会话bean不必编码为可重入..."

multithreading unit-testing ejb java-ee

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

使用访问或 ID 令牌/令牌交换建立 SSO/设置 cookie

我允许登录外部应用程序的用户通过 Keycloak 的身份代理和外部到内部令牌交换使用他们的访问令牌跳转到我们的应用程序。

现在,我想在我们的应用程序中的嵌入式 JxBrowser 中建立一个 SSO 会话,类似于常规浏览器登录流程,其中在浏览器中设置了三个 cookie:AUTH_SESSION、KEYCLOAK_SESSION(_LEGACY) 和 KEYCLOAK_IDENTITY(_LEGACY)。

KEYCLOAK_IDENTITY 包含一个Serialized-ID类似于 ID 标记的类型标记。

是否可以使用交换的(内部)访问和/或 ID 令牌创建 KEYCLOAK_IDENTITY cookie,并且如果其他两个 cookie 也已正确创建,这是否会建立有效的 SSO 会话?

基本上我所缺少的是如何获取或创建Serialized-ID类型令牌。

cookies single-sign-on keycloak keycloak-services token-exchange

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