如何在 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
的成员字段中,并从那里访问它。
顺便说一句,您可能想看看是否可以想出两个不像 ConnectThread
和 ConnectedThread
那样彼此相似的 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
的成员字段中,并从那里访问它。
顺便说一句,您可能想看看是否可以想出两个不像 ConnectThread
和 ConnectedThread
那样彼此相似的 class 名称,这只是添加让你感到困惑。