小编Bri*_*ham的帖子

在Java中安全地将long转换为int

Java中最常用的方法是验证转换longint不会丢失任何信息?

这是我目前的实施:

public static int safeLongToInt(long l) {
    int i = (int)l;
    if ((long)i != l) {
        throw new IllegalArgumentException(l + " cannot be cast to int without changing its value.");
    }
    return i;
}
Run Code Online (Sandbox Code Playgroud)

java casting

467
推荐指数
7
解决办法
56万
查看次数

更新通知文本,而不是整个通知

序幕

我正在尝试在通知上添加计时器.计时器是一项服务.每一行调用此行(继续Thread是一个"running"布尔值,timeString是精心设计的String,显示时间):

NotificationChrono.updateNotification(getApplicationContext(), continueThread, 
NOTIF_ID, timeString, "Chronometer", notificationManager);
Run Code Online (Sandbox Code Playgroud)

这是NotificationChrono类:

public class NotificationChrono {

    static public void updateNotification(Context context, boolean running,
        int id, String title, String text,
        NotificationManager notificationManager) {

        Intent stopIntent = new Intent("com.corsalini.david.barcalc.STOP");
        PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context,
            0, stopIntent, 0);

    Intent startIntent = new Intent(
            "com.corsalini.david.barcalc.STARTPAUSE");
    PendingIntent startPendingIntent = PendingIntent.getBroadcast(context,
            0, startIntent, 0);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            context)

            .setContentText(context.getString(R.string.notif_text))

            .setContentTitle(title)

            .setSmallIcon(R.drawable.ic_action_alarm_2)

            .setAutoCancel(false)

            .setOngoing(running)

            .setOnlyAlertOnce(true)

            .setContentIntent(
                    PendingIntent.getActivity(context, 10, new Intent(
                            context, FrontActivity.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0))
            .addAction(
                    running ? R.drawable.ic_action_pause
                            : …
Run Code Online (Sandbox Code Playgroud)

android android-notifications

44
推荐指数
3
解决办法
4万
查看次数

defmethod抓住所有

我有一个专门研究两个参数的多方法:

(defmulti get-tag-type (fn [type tag] [type tag]))
Run Code Online (Sandbox Code Playgroud)

拥有该类型允许我将不同的defmethod调用分组:

(defmethod get-tag-type [::cat 0] [type tag] ::tiger)
(defmethod get-tag-type [::cat 1] [type tag] ::lion)
(defmethod get-tag-type [::cat 2] [type tag] ::jaguar)

(defmethod get-tag-type [::dog 0] [type tag] ::poodle)
(defmethod get-tag-type [::dog 1] [type tag] ::australian-shepherd)
(defmethod get-tag-type [::dog 2] [type tag] ::labrador-retriever)
Run Code Online (Sandbox Code Playgroud)

但是,有时候,我想要一个catch all或默认为其中一个组,如果没有其他组匹配则会调用它们:

(defmethod get-tag-type [::dog :default] ::mutt)
Run Code Online (Sandbox Code Playgroud)

但是,除非tag实际上这不起作用:default.

有什么好办法来实现这个目标?

clojure multimethod

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

emacs加载路径

我想更改我的emacs源代码主题.他们在emacswiki中说我必须在我的加载路径中的目录中添加.el文件,但是我的加载路径是什么?我该如何访问它?

emacs elisp

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

NSTableView 重新排序时处理选定的行

这是一个关于 NSTableView 的 UI 行为最佳实践的问题。

我有一个 NSTableView,其内容偶尔会刷新。用户可以选择表中的无行、一行或多行。刷新数据时,可以删除某些行或重新排序。NSTableView 的默认行为似乎是保持选择相同的行索引,无论数据如何重新排序(我理解这种行为,因为 NSTableView 如何知道行移动到哪里?)

我可以更改此行为以在重新加载数据后修改选择,以便用户的原始选择保持选中状态,即使它们已移动。这将更改所选的行索引,因此也可能会让用户感到不舒服。

苹果对这种情况有什么要说的或者有标准行为吗?

cocoa hig nstableview

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

从扩展Generic中提取泛型类型

我正在尝试重构一个类和一组子类,其中M类型确实扩展了任何东西,即使我们知道它必须是某种类型的子类.该类型是参数化的,我希望它的参数化类型可用于已经具有M值的子类.

有没有办法定义这个类,而不必在参数列表中包含冗余的K和V泛型类型.我希望能够让编译器从子类映射到的M中推断它们.

public abstract class NewParametrized<K, V, M extends SomeParametrized<K, V>> {

    public void someMethodThatTakesKAndV(K k1, V v1) { }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望类声明看起来像:

 public class NewParametrized<M extends SomeParametrized<K, V>> {
Run Code Online (Sandbox Code Playgroud)

K和V的类型将从M.的定义推断出来.

java generics

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

跨多个Android版本实现SharedPreferences

对于我的应用程序,我有一个自定义实现SharedPreferences.

在API级别9中,apply方法已添加到SharedPreferences.Editor界面中.

但是,VerifyError如果我将该方法添加到我的实现并尝试使用它,Android 1.6会抛出一个.

以向后兼容的方式使这项工作的最佳方法是什么?

编辑:

我应该澄清我的难题.在我切换到目标Gingerbread之前,我的实现SharedPreferences.Editor没有包含该apply方法.切换目标后,由于我的实现中缺少该方法,因此停止编译.

添加该方法的实现修复了编译问题,但又添加了一个新问题:Android 1.6甚至不会加载该类,抛出一个VerifyError.即使我发现错误,我的自定义实现也永远不会加载到1.6.

到目前为止,我最好的想法是使我自己的接口与SharedPreferences和SharedPreferences.Editor相同,并实现它们.当然,这需要在整个代码中进行彻底的更改,所以我尽量避免使用它.

android backwards-compatibility

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

主线程用法

我正在尝试确定什么会降低我的应用程序的性能,我正在研究什么是垄断主线程.

我刚刚发现Looper.setMessageLogging并正在设置客户Printer以查看主线程的使用方式:

Looper.getMainLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "MainLooper")) {

    private long startTime = 0L;

    @Override
    public void println(String x) {
        if (x.startsWith(">")) {
            startTime = System.nanoTime();
        } else if (x.startsWith("<")) {
            final long duration = System.nanoTime() - startTime;
            x += " (" + (duration / 1000000L) + " ms)";
        }
        super.println(x);
    }

});
Run Code Online (Sandbox Code Playgroud)

这让我发现,是的,有很多代码需要超过500毫秒,有些代码需要几秒钟,这可能是性能如此糟糕的原因.

D/MainLooper( 1542): >>>>> Dispatching to Handler{433ae6a0} null: 1000
D/MainLooper( 1542): <<<<< Finished to    Handler{433ae6a0} null (952 ms)
Run Code Online (Sandbox Code Playgroud)

现在,我只能理解这些日志消息了.我不知道在主线程上采用952 ms的方法是什么.有没有更好的方法来确定花费这么长时间的方法?

performance user-interface android

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

了解core.logic!=

我希望下面的表达式返回一些结果,每个结果由两个cons单元组成,其中两个cons单元不相等.但是,它返回0结果.为什么我没有结果?

(run* [c1 c2] 
  (fresh [lx ly x1 y1 x2 y2] 
    (== lx [1 2])
    (== ly [4 5])
    (membero x1 lx)
    (membero x2 lx) 
    (membero y1 ly)
    (membero y2 ly)
    (conso x1 y1 c1)
    (conso x2 y2 c2)
    (!= c1 c2)))
Run Code Online (Sandbox Code Playgroud)

预期结果的例子:

  • [(1 . 4) (2 . 5)]
  • [(1 . 4) (1 . 5)]
  • [(2 . 4) (2 . 5)]

我不希望它返回一个结果,比如[(1 . 4) (1 . 4)]每个缺点中的两个点都相等.

如果我删除该(!= c1 c2)部分,我会得到16个结果,包括两个缺点相同的结果.

如果我更换(!= c1 c2),我会得到我期望的结果:

(conde …
Run Code Online (Sandbox Code Playgroud)

clojure clojure-core.logic

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

Java - 正则表达式分割输入文本但保留分隔符

寻找一些正则表达式的帮助.我正在寻找一种Java方法,用文字分割一些输入文本,但也保留分隔符(空格,标点符号).另一种方法是将单词拆分为自己的索引,其他非单词字符可以放在数组的其他索引中.

这个输入文字:

"Hello, this isn't working!"
Run Code Online (Sandbox Code Playgroud)

应该放入这样的数组:

{"Hello", ",", "this", "isn't", "working", "!"}
Run Code Online (Sandbox Code Playgroud)

要么

{"Hello", ", ", "this", " ", "isn't", " ", "working", "!"}
Run Code Online (Sandbox Code Playgroud)

我用Python做了基本相同的事情:

def split_input(string):
    return re.findall(r"[\w']+|[\s.,!?;:-]", string)
Run Code Online (Sandbox Code Playgroud)

但我还没有找到一种在Java中完成同样事情的方法.我尝试String.split()过前瞻/后视,我尝试过模式匹配,但运气不好.

任何帮助将非常感激!

java regex

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