首页 > 解决方案 > 从另一个类调用非静态方法

问题描述

请原谅凌乱的代码,我正在学习如何编辑模板应用程序。有很多代码没有做任何事情。

基本上,我试图将一个名为 sBuffer 的字符串移动到 Activity 类中,以在文本视图中的屏幕上显示数据。该函数在我的 TemplateManager 中被调用。

我已经被这个问题困扰了很长一段时间,非常感谢您的帮助。

我不知道如何调用我在 TemplateManager 中 TemplateDataCallback 中的 onDataReceived 函数而不使我的 onDataReceived 静态。当它是静态的时,我不能使用意图来移动数据。

尝试了昆仑的添加 (new TemplateDataCallback()).onDataReceived(device, data);

它在数据进入时编译、安装、运行并崩溃。通知已成功启用 2020-07-16 09:58:40.591 20526-20539/no.nordicsemi.android.nrftoolbox D/BluetoothGatt: onConnectionUpdated() - Device=FE:C3 :7B:D6:A0:27 间隔=39 延迟=0 超时=500 状态=0 2020-07-16 09:58:40.591 20526-20539/no.nordicsemi.android.nrftoolbox I/BleManager:连接参数更新(间隔:48.75ms,延迟:0,超时:5000ms)2020-07-16 09:58:41.699 20526-20539/no.nordicsemi.android.nrftoolbox I/BleManager:从 6e400003-b5a3-f393-e0a9-e50e24dcca9e 收到通知,值:(0x) 64-66-67-0D 2020-07-16 09:58:41.704 20526-20526/no.nordicsemi.android.nrftoolbox D/ascii: onDataReceived:dfg 2020-07-16 09:58:41.705 20526-20526/no.nordicsemi.android.nrftoolbox D/AndroidRuntime:关闭 VM 2020-07-16 09:58:41.709 20526-20526/no.nordicsemi。android.nrftoolbox E/AndroidRuntime:致命异常:主进程:no.nordicsemi.android.nrftoolbox,PID:20526 java.lang.NullPointerException:尝试调用虚拟方法'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread ()' 在 android.app.Activity.startActivityForResult(Activity) 的 android.app.Activity.startActivityForResult(Activity.java:4697) 的空对象引用.java:4654) 在 androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662) 在 android.app.Activity.startActivity(Activity.java:5015) 在 android.app.Activity.startActivity(Activity.java: 4983) 在 no.nordicsemi.android.nrftoolbox.template.callback.TemplateDataCallback.onDataReceived(TemplateDataCallback.java:42) 在 no.nordicsemi.android.nrftoolbox.template.TemplateManager$TemplateManagerGattCallback.lambda$initialize$3(TemplateManager.java:84) 在 no.nordicsemi.android.nrftoolbox.template.-$$Lambda$TemplateManager$TemplateManagerGattCallback$AaM3yOzPmG7Maq2q- 1Ltp4MIo4Q.onDataReceived(Unknown Source:0) at no.nordicsemi.android.ble.ValueChangedCallback.lambda$notifyValueChanged$0(ValueChangedCallback.java:147) 在 no.nordicsemi.android.ble.-$$Lambda$ValueChangedCallback$4rcq0bbOhcTVqpLmftoy8pUEJ-Q .run(Unknown Source:6) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java :214) 在 android.app.ActivityThread.main(ActivityThread.java:7156) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975) 2020-07-16 09:58:45.688 20526-20539/no.nordicsemi.android.nrftoolbox D/BluetoothGatt: onConnectionUpdated( ) - 设备=FE:C3:7B:D6:A0:27 间隔=60 延迟=0 超时=400 状态=0 2020-07-16 09:58:45.688 20526-20539/no.nordicsemi.android.nrftoolbox I/ BleManager:连接参数更新(间隔:75.0ms,延迟:0,超时:4000ms)

==================================================== =======================================

这是我正在捕获数据的课程。

公共抽象类 TemplateDataCallback 扩展 AppCompatActivity {

public static String sBuffer;
private static String bstr;
private static String MainString;
public static String ascii;

public void onDataReceived(@NonNull final BluetoothDevice device, @NonNull final Data data) {

    bstr = new String (String.valueOf(data));
    int istr = bstr.length();
    MainString = bstr.substring(5,istr); // split string into hex
    String dashless = MainString.replaceAll("\\-",""); // remove dashes
    ascii = "";

    for (int i = 0; i < dashless.length(); i += 2) {

        String part = dashless.substring(i, i + 2);   // extract two characters from hex string
        char ch = (char)Integer.parseInt(part, 16); // change it into base 16 and typecast as the character
        ascii = ascii + ch;  // add this char to final ASCII string
    }

    Log.d("ascii", "onDataReceived:"+ascii);
    sBuffer = ascii;

    Intent intent = new Intent(TemplateDataCallback.this, TemplateActivity.class);
    intent.putExtra("DATA",sBuffer);
    startActivity(intent);

}

}

这是我出错的部分,无法调用我的 onDataReceived 函数。** 指出的错误,消息是“无法从静态上下文引用非静态方法 'onDataReceived(android.bluetooth.BluetoothDevice, no.nordicsemi.android.ble.data.Data)'”

公共类 TemplateManager 扩展 BatteryManager {

static final UUID SERVICE_UUID = UUID.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E"); // UART Service ID
private static final UUID MEASUREMENT_CHARACTERISTIC_UUID = UUID.fromString("6E400003-B5A3-F393-E0A9-E50E24DCCA9E"); // UART TX Service
private static final UUID READABLE_CHARACTERISTIC_UUID = UUID.fromString("00002A38-0000-1000-8000-00805f9b34fb"); // Body Sensor Location
private static final UUID OTHER_SERVICE_UUID = UUID.fromString("00001800-0000-1000-8000-00805f9b34fb"); // Generic Access service
private static final UUID WRITABLE_CHARACTERISTIC_UUID = UUID.fromString("00002A00-0000-1000-8000-00805f9b34fb"); // Device Name

private BluetoothGattCharacteristic requiredCharacteristic, deviceNameCharacteristic, optionalCharacteristic;

public String sBuffer;

public TemplateManager(final Context context) {
    super(context);
}

@NonNull
@Override
protected BatteryManagerGattCallback getGattCallback() {
    return new TemplateManagerGattCallback();
}

private class TemplateManagerGattCallback extends BatteryManagerGattCallback {

    @Override
    protected void initialize() {

        super.initialize();

        requestMtu(260)
                .with((device, mtu) -> log(LogContract.Log.Level.APPLICATION, "MTU changed to " + mtu))
                .done(device -> {

                })
                .fail((device, status) -> log(Log.WARN, "MTU change not supported"))
                .enqueue();

        setNotificationCallback(requiredCharacteristic)
                .with((device, data) -> {
                    TemplateDataCallback.**onDataReceived**(device, data); // ERROR onDataRecived 
                });

        enableNotifications(requiredCharacteristic)
                .with((device, data) -> log(Log.DEBUG, "Data sent: " + data))
                .done(device -> log(LogContract.Log.Level.APPLICATION, "Notifications enabled successfully"))
                .fail((device, status) -> log(Log.WARN, "Failed to enable notifications"))
                .enqueue();
    }

==================================================== =======================================

标签: javaandroidandroid-intentstatic-methods

解决方案


推荐阅读