如何在课外调用方法

时间:2016-09-10 22:01:09

标签: java methods access-specifier

是否可以使用现有实例在类外部调用方法?我想从传感器读取数据并尝试通过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");
        }
    }
}

1 个答案:

答案 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 membersthe 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的成员字段中,然后从那里访问它。

顺便说一下,你可能想知道你是否可以提出两个与MainActivityConnectThread不相似的类名,这只会增加你的困惑。