如何使用Nativescript中的接口类型参数调用Java方法(自定义类)

时间:2018-01-19 00:42:54

标签: java android typescript nativescript nativescript-plugin

我正在创建一个Nativescript插件。它包括一个自定义Android库(AAR),我想从Typescript代码中使用它。当我运行演示(在设备或模拟器中)时,在调用此TypeError: sender.registerListener is not a function方法时出现registerListener错误,这很奇怪,因为我能够调用同一对象的其他方法。

我认为可能是因为我没有正确实现参数所需的接口。我认为我可以用代码更好地解释它:

Sender.java:我将在Typescript中使用的公共类:

package com.berriart.android.myplugin;

public class Sender {
    public static final String TAG = "Sender";

    private Context _context = null;

    public Sender(Context context) {
        _context = context;
    }

    public void send(final String messagePath, final String messageToSend) {
        if (Log.isLoggable(TAG, Log.INFO)) {
            Log.i(TAG, "Send call: " + messagePath + " " + messageToSend);
        }
    }

    public void registerListener(MessageListener listener) {
        if (Log.isLoggable(TAG, Log.INFO)) {
            Log.i(TAG, "registerListener");
        }
    }

    // Other code here
}

MessageListener.java:必须由registerListener参数实现的接口:

package com.berriart.android.myplugin;

public interface MessageListener {
    void receive(String messagePath, String messageReceived);
}

这是插件(to)的Typescript(Nativescript)代码:

import * as app from "tns-core-modules/application";

export class WearMessaging {
    public static send(messagePath: string, messageToSend: string) {
        let sender = new com.berriart.android.myplugin.Sender(app.android.context);

        sender.send(messagePath, messageToSend);
    }

    public static registerListener(receiveCallback: (messagePath: string, messageReceived: string) => void) {
        let messageListener = new com.berriart.android.myplugin.MessageListener({
            receive: receiveCallback
        });
        let sender = new com.berriart.android.myplugin.Sender(app.android.context);
        sender.registerListener(messageListener);
    }
}

如果我在我的nativescript应用程序中包含WearMessaging.send("/demo", "Hola");,它会编译并正常运行,它会成功调用Java方法。但如果我跑:

WearMessaging.registerListener((messagePath: string, messageReceived: string) => {
  console.log(messagePath);
  console.log(messageReceived);
});

应用程序在运行时停止并抛出:TypeError: sender.registerListener is not a function引用myplugin.android.ts文件。

我正在努力做这项工作,所以,如果你有任何线索,请告诉我。正如我所说的那样,我认为这是因为我在实现接口时遗漏了一些东西,因为参数类型与它们不匹配,所以方法无法被识别,但也许我错了。

在这里你可以看到一些官方文档: https://docs.nativescript.org/runtimes/android/generator/extend-class-interface

提前致谢。

1 个答案:

答案 0 :(得分:0)

好的,我解决了它:S

似乎增量构建做错了。手动删除后,演示的构建文件一切正常:

rm -rf platforms/android/build/*
rm -rf platforms/android/app/build/*
# Then build & deploy again

因此,如果您需要做类似的事情,问题代码似乎没问题。