小编Kar*_*ell的帖子

点击通知开始活动两次

我正在使用以下代码从服务创建通知:

NotificationManager notificationManager = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);

CharSequence tickerText = "bla ...";
long when = System.currentTimeMillis();
Notification notification = new Notification(R.drawable.icon,
tickerText, when);

Intent notificationIntent = new Intent(ctx, SearchActivity.class).
putExtra(SearchActivity.INTENT_SOURCE,
MyNotificationService.class.getSimpleName());

PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
notificationIntent, 0);
notification.setLatestEventInfo(ctx, ctx.getString(R.string.app_name),
tickerText, contentIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(1, notification);
Run Code Online (Sandbox Code Playgroud)

日志清楚地表明方法startActivity被调用两次:

04-02 23:48:06.923: INFO/ActivityManager(2466): Starting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,520][480,616] (has extras) }
04-02 23:48:06.923: WARN/ActivityManager(2466): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,520][480,616] (has extras) } …
Run Code Online (Sandbox Code Playgroud)

notifications android android-activity

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

使Java的ByteBuffer线程安全的选项

我有什么选择使ByteBuffer线程安全?众所周知,它不是线程安全的,因为它保护位置,限制和一些(/ all?)方法依赖于这个内部状态.

对于我的目的,如果多个读线程是安全的就足够了,但对于其他未来的访问者,我想知道我需要知道哪些技术/技巧/陷阱才能使其完全线程安全.

我的想法:

  • 为所有方法同步或使用ReadWrite锁.可能是最慢的方法(?)
  • Subclassing ByteBuffer并避免持久化线程绑定状态,如位置等.并相应地为所有需要使用内部状态的方法抛出异常.这将是紧张.但是有陷阱吗?(除了我必须将直接映射的内存读入堆内存...)

我可以使用哪些其他技巧?我如何使用DirectBuffer实现"读取时克隆字节" - 它是否可能?可能会将完整的ByteBuffer(ByteBuffer.slice)切成一个解决方案吗?

更新:是什么意思在这个问题"复制(同步时),以获得一个新的实例指向同一个映射字节"

java bytebuffer thread-safety

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

使用AllPermission启用Java SecurityManager

我试图让自己熟悉,SecurityManager但即使这个简单的场景也失败了.当我从IDE或命令行中运行以下内容时,我得到以下异常 ;

access denied ("java.util.PropertyPermission" "java.home" "read")
Run Code Online (Sandbox Code Playgroud)

我以为我用这段代码允许了所有内容:

Policy.setPolicy(new Policy() {

    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        Permissions perm = new Permissions();
        perm.add(new AllPermission());
        return perm;
    }
});
System.setSecurityManager(new SecurityManager());
System.out.println(System.getProperty("java.home"));
Run Code Online (Sandbox Code Playgroud)

这与JVM的派生策略有关吗?我怎么干净利落setPolicy()

以下代码似乎也出现了同样的误解:

System.setSecurityManager(new SecurityManager());
final Permissions allPermission = new Permissions();
allPermission.add(new AllPermission());
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
    System.out.println(System.getProperty("java.home"));
    return null;
}, new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain(null, allPermission)}));
Run Code Online (Sandbox Code Playgroud)

更新:第二种情况是可以理解的,因为提供的权限只是一个进一步的限制:(javadoc)操作是通过调用者保护域拥有的权限与指定的域所拥有的权限的交集来执行的.AccessControlContext

java securitymanager java-security

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

使用多项式时间有哪些"最难"的问题?

最近我读了一个研讨会的工作说:

匹配算法[对于一般图]可以扩展到加权情况,这似乎是可以在多项式时间内解决的"最难"的组合优化问题之一.

我立即想到了以下问题:

你知道其他"P-hard"问题吗?

现在我想把P-hard定义为:"在这个问题的文献中发现了一个多项式算法(1950年以后)".(或者,如果已经有一个确定性算法可以解决多项式时间内的问题,那怎么能更好地定义"硬"?)

algorithm np-hard time-complexity

10
推荐指数
3
解决办法
2607
查看次数

使用JavaScript编写xml的库

我正在使用JavaScript(node.js)进行一些服务器端编码,我想编写有效的xml.

我发现了两个库,但我相信还有更多/更好!?

要求:开源(用于商业用途)

如果项目快速,小巧且易于使用(按此顺序),那将会很酷.我想有一个更低级别访问ala

doc.addElement('xy').addAttr('name', 'bob');
Run Code Online (Sandbox Code Playgroud)

javascript xml serverside-javascript

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

Java mmap在Android上失败,"mmap失败:ENOMEM(内存不足)"

使用Java在Android上映射大型文件的内存效果很好.但是,即使有多个映射调用,当总共映射超过~1.5GB时,它也会失败:

mmap failed: ENOMEM (Out of memory)
Run Code Online (Sandbox Code Playgroud)

请参阅此处的完整讨论.注意:它在服务器Linux上不会失败.为应用程序启用了android:largeHeap ="true".

以下Java代码被称为几百次,每次调用请求~1MB:

ByteBuffer buf = raFile.getChannel().map(allowWrites ? FileChannel.MapMode.READ_WRITE : FileChannel.MapMode.READ_ONLY, offset, byteCount);
Run Code Online (Sandbox Code Playgroud)

避免请求一个通常难以找到的大的连续内存块.请在此处查看完整代码.请记住,将"段大小"(即单个地图调用的大小)加倍无效,这意味着它会停在相似的内存位置.另外值得注意的是,两个略低于极限的应用程序正在执行正常(暗示每个进程限制).

相关问题在这里,这里,这里,这里,这里,这里,这里这里.

使用多个文件而不是一个具有多个映射的文件会有帮助吗?

我已经读过,这可能是虚拟地址空间的每个进程限制.哪里可以找到更多相关信息?我可以用NDK更改此设置,例如如何调用ulimit?可以由madvise帮我一点吗?

更新

有关可在Java中使用的mmap工具,请参阅此处的答案

java android memory-management mmap android-ndk

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

Java垃圾收集器G1GC需要很长时间才能进行"对象复制"(疏散暂停)

我不是Java newby,但我只知道垃圾收集.现在我想通过一些实践经验来改变它.我的目标是延迟不到0.3秒,或者在极端情况下0.5也可以.

我有一个-Xmx50gb(-Xms50gb)的应用程序,并设置其他GC选项:

-XX:+UseG1GC -Xloggc:somewhere.gc.log -XX:+PrintGCDateStamps
Run Code Online (Sandbox Code Playgroud)

但是现在我偶尔因为垃圾收集而长时间暂停超过5秒,尽管似乎有足够的可用内存.我找到的一个原因:

[GC pause (G1 Evacuation Pause) (young) 42G->40G(48G), 5.9409662 secs]
Run Code Online (Sandbox Code Playgroud)

为什么GCG1仍然为此做"停止世界"?(或者至少我看到它正好在这个时候停止我的应用程序)为什么它会做这样的负面清理,如果它不是真的有必要,因为有超过12%的可用RAM空闲.另外我认为默认值-XX:MaxGCPauseMillis是200毫秒,为什么这个值被违反29或甚至50(见下文)?

延迟的另一个原因是:

[GC pause (Metadata GC Threshold) (young) (initial-mark) 40G->39G(48G), 10.4667233 secs]
Run Code Online (Sandbox Code Playgroud)

这可能通过这个答案解决,例如只增加元数据空间-XX:MetaspaceSize=100M

顺便说一句:使用JSE 1.8.0_91-b14

更新:此类事件的详细GC日志

2016-08-12T09:20:31.589+0200: 1178.312: [GC pause (G1 Evacuation Pause) (young) 1178.312: [G1Ergonomics (CSet Construction) start choosing CSet, _pending_cards: 3159, predicted base time: 1.52 ms, remaining time: 198.48 ms, target pause time: 200.00 ms]
 1178.312: [G1Ergonomics (CSet Construction) add young regions to CSet, …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection

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

Dropwizard热部署

我正在寻找一个简单易用的Java系统,它为我创建了一个REST服务.所以我找到了dropwizard,但据我可以使用谷歌,它发现它缺乏热部署,虽然码头能够这样做.使用maven-shade-plugin时,至少需要10秒才能构建该东西.此外,我的IDE报告说,当涉及shade-plugin时,它不能使用编译保存功能(也就是热部署).

我可以用某种方式使用hotdeployment吗?或者我可以使用什么呢?

更新:如果没有什么能解决这个问题,我可能会使用球衣和guice等的组合,这在本文中有所解释

java rest hotdeploy dropwizard

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

精确的子像素线绘制算法(光栅化算法)

我需要一种比Bresenham线绘制算法慢一点的算法,但必须更精确.使用'exact'我的意思是:应该打印每个触摸的像素.不多也不少!这意味着使用更粗的线或类似物不是一种选择,因为将涉及太多的像素.此外,我并不需要一个图形框架或类似就像是 之前,我需要的算法!应用程序实际上不是"图形",它位于像素为"图块" 的地理区域.

对我来说主要的问题是我需要子像素精度,这意味着一条线可以从0.75/0.33开始,而不仅仅是0/0,就像整数值的情况一样.我尝试在过去几个小时内创建一个可行的解决方案,但无法使其正常工作 - 边缘情况太多了.

首先,我认为抗锯齿的版本就像从算法应,但它打印像素过多(尤其是起点和终点),并在某些情况下,还惦记着,例如在非常短的线条一些像素.

然后我试着让Bresenham在我用'else if'取代第二个'if'的地方工作,这里指出了它,但它更接近但仍然不存在.然后我尝试将Bresenham从整数移动到浮点精度,这导致无限循环(因为x,y值跳过完成条件if (y1 == y2 && x1 == x2)).

我可以使用天真的线条绘图解决方案,但delta我应该使用哪个?例如,如果我使用0.1,我仍然会错过一些像素并使用较小的值,它可能会花费太长时间(仍然会错过像素).

C/Java/...中的工作解决方案将不胜感激.至少它应该适用于八分之一,但一个完整的解决方案会更好.

更新:我提出了以下想法:使用朴素行光栅化,您可以为每个点计算4个像素候选.然后检查这4个像素,如果该线真正穿过它们.但我不确定线/盒交叉点是否足够快.

algorithm math graphics raytracing bresenham

9
推荐指数
2
解决办法
4053
查看次数

我为什么要使用JMS而不是RMI + Queue?

目前我正在使用RMI或粗体库在我的服务器和客户端之间进行通信(通过LinkedBlockingQueue).现在我读到了可以在这个领域使用的JMS.它是否正确?如果是的话,你介意给我一个简单的优缺点列表,因为它似乎是一个非常复杂和"全面 - 企业"的领域.

有什么好处?与RMI + Queue相比,性能如何呢?JMS能否击败RMI +队列?

PS:我知道有类似的问题,但我希望将JMS与RMI + Queue进行比较.

java queue jms rmi

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