如何在 class 之外调用方法

How to call method outside class

是否可以使用现有实例在 class 外部调用方法?我想从传感器读取数据并尝试通过 BT 连接发送它(已经连接并发送其他信息)但我无法从 "onSensorChange".

调用 write() 方法

我只能调用 write() 并在 "private class ConnectThread" 中发送消息(使用 connectedThread.write();)。

整个代码非常有用,我只发送其中最重要的部分来让您了解我的问题。

提前致谢!

public class MainActivity extends WearableActivity implements SensorEventListener{

BluetoothAdapter bluetoothAdapter;
String TEXT = "textToSend"; 
private SensorManager sensorManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);  
}

@Override
public void onSensorChanged(SensorEvent event) {     
   TEXT = "..something that I want to send..";

   ConnectedThread.currentThread.write(); //TOTAL nonsense, tried several things but 
//cannot call write(), how should I call this from existing thread?  
}


/* ___ Finding paired devices ___ */
private void pairedDevices() {       
    final ConnectThread connectThread = new ConnectThread(device);              
}


/* ___ Connecting to a Server. ___*/
private class ConnectThread extends Thread {

    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;
    ConnectedThread connectedThread;

    public void run() {
            mmSocket.connect();
            Log.d("Connected", "To Server");

            connectedThread = new ConnectedThread(mmSocket);
            connectedThread.start();
            connectedThread.write();
    }                 
}


/* Managing Connection */
private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;

    public ConnectedThread(BluetoothSocket socket) {

    private void write() { //How to acces this method from "public void onSensorChanged"?

        if (TEXT != null) {
            outputStream.println(TEXT);
            Log.d(TEXT, "Written to Server");
        }
    }
}

好的,有几个问题。实际上,不止几个,所以这个答案有点到处都是(TL;DR:去阅读教程再试一次):

首先write()private。与其解释这意味着什么,因为这已经在很多地方得到了很好的解释,我建议你看看 the official tutorial on access specifiers.

其次,即使你没有做到private,你也有:

ConnectedThread.currentThread.write(); 

但是由于某些原因您不能这样做。首先,没有 ConnectedThread.currentThread 所以我假设你的意思是 ConnectThread.connectedThread,其次 connectedThread 是实例成员而不是 class 成员(即静态),所以你需要一个实际的 ConnectThread 实例:

private class ConnectThread extends Thread {
    ...
    ConnectedThread connectedThread;
    ...
}

因此您可能还想阅读 the official tutorial on class members and the official tutorial on instance members. I also strongly suggest you take a quick look at the general write-up about variables 以了解概览。

您需要 一个 ConnectThread 实际的、特定的实例 才能在此处使用(简单地使其成为静态 而不是 此处的正确选择,即使它会编译)。因此,您需要使 onSensorChanged() 方法可用。不幸的是,现在建议变得过于宽泛,有很多方法可以给这只猫剥皮,所以你真的应该通读所有相关的官方教程,然后从头开始再试一次。

我会这样说:你有...

private void pairedDevices() {       
    final ConnectThread connectThread = new ConnectThread(device);              
}

此处 connectThread 在该函数 returns 后立即超出范围。也就是说,您创建一个 ConnectThread,然后立即丢弃您对它的所有引用,从而注定您自己永远无法使用您刚刚创建的那个实例。你不需要那样做。例如,您可以将它存储在 MainActivity 的成员字段中,并从那里访问它。

顺便说一句,您可能想看看是否可以想出两个不像 ConnectThreadConnectedThread 那样彼此相似的 class 名称,这只是添加让你感到困惑。