是否可以使用现有实例在类外部调用方法?我想从传感器读取数据并尝试通过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");
}
}
}
答案 0 :(得分:0)
好的,有几个问题。实际上,不止一些,所以这个答案将会到处都是( TL; DR:去阅读教程并再试一次):
首先write()
是private
。而不是解释这意味着什么,因为在许多地方已经很好地解释了这一点,我建议你只看一下the official tutorial on access specifiers。
其次,即使你不是private
,你也有:
ConnectedThread.currentThread.write();
但出于某些原因,你无法做到这一点。首先,没有ConnectedThread.currentThread
所以我假设你的意思是ConnectThread.connectedThread
,其次connectedThread
是实例成员而不是类成员(即静态),所以你需要一个实际的{{} 1}}实例:
ConnectThread
因此,您可能还想阅读the official tutorial on class members和the official tutorial on instance members。我还强烈建议您快速查看general write-up about variables以获取概述。
你需要private class ConnectThread extends Thread {
...
ConnectedThread connectedThread;
...
}
的实际的,特定的实例才能在这里工作(简单地说,静态不是这里是正确的选择,即使它会编译)。因此,您需要将其提供给ConnectThread
方法。不幸的是,建议现在变得过于宽泛,有很多方法可以让这只猫受到影响,所以你真的应该阅读所有相关的官方教程,然后从头开始再给它一个镜头。
我会说:你有......
onSensorChanged()
一旦该函数返回,private void pairedDevices() {
final ConnectThread connectThread = new ConnectThread(device);
}
就会超出范围。也就是说,你创建了一个connectThread
,然后立即丢弃你所拥有的任何引用,从而使你自己永远无法使用你刚创建的那个实例。你不需要那样做。例如,您可以将其存储在ConnectThread
的成员字段中,然后从那里访问它。
顺便说一下,你可能想知道你是否可以提出两个与MainActivity
和ConnectThread
不相似的类名,这只会增加你的困惑。