Comment appeler une méthode en dehors de la classe


JoeDoe

Est-il possible d'appeler une méthode en dehors de la classe, en utilisant une instance existante? Je veux lire les données du capteur et essayer de les envoyer via une connexion BT (déjà connectée et envoyant d'autres informations) mais je ne peux pas appeler la méthode write () depuis "onSensorChange".

Je ne suis capable d'appeler write () et d'envoyer un message que dans la "classe privée ConnectThread" (en utilisant connectedThread.write ();).

Le code entier fonctionne comme un charme, je n'envoie que les parties les plus importantes pour vous familiariser avec mon problème.

Merci d'avance!

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");
        }
    }
}
Jason C

Ok donc quelques problèmes. En fait, plus que quelques-uns, et donc cette réponse va être un peu partout ( TL; DR: allez lire les tutoriels et réessayez ):

Tout d'abord write()est private. Plutôt que d'expliquer ce que cela signifie, puisque cela est déjà bien expliqué dans de nombreux endroits, je vous suggère de jeter un œil au tutoriel officiel sur les spécificateurs d'accès .

Deuxièmement, même si vous ne l' privateavez pas fait , vous avez:

ConnectedThread.currentThread.write(); 

Mais vous ne pouvez pas faire cela pour plusieurs raisons. Premièrement, il n'y a pas ConnectedThread.currentThreaddonc je suppose que vous vouliez dire ConnectThread.connectedThread, et deuxièmement, connectedThreadun membre d'instance n'est pas un membre de classe (c'est-à-dire statique), vous avez donc besoin d'une ConnectThreadinstance réelle :

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

Vous voudrez peut-être également lire le didacticiel officiel sur les membres de la classe et le didacticiel officiel sur les membres de l'instance . Je vous suggère également fortement de jeter un coup d'œil à la description générale des variables pour un aperçu.

Vous avez besoin d'une instance réelle et spécifique de a ConnectThreadpour travailler avec ici (le simple fait de rendre statique n'est pas le bon choix ici même si cela compilerait). Vous devez donc mettre cela à la disposition de votre onSensorChanged()méthode. Malheureusement, les conseils deviennent maintenant trop généraux, il existe de nombreuses façons d'écorcher ce chat, vous devriez donc vraiment lire tous les tutoriels officiels pertinents, puis lui donner une autre chance à partir de zéro.

Je dirai ceci: vous avez ...

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

Ici connectThreadsort de la portée dès le retour de cette fonction. Autrement dit, vous créez un ConnectThread, puis jetez immédiatement toutes les références que vous y aviez, vous condamnant ainsi à ne jamais pouvoir utiliser cette instance que vous venez de créer. Vous n'aurez pas besoin de faire ça. Vous pouvez le stocker dans un champ membre de MainActivity, par exemple, et y accéder à partir de là.

Btw, vous voudrez peut-être voir si vous pouvez trouver deux noms de classe qui ne sont pas aussi similaires que ConnectThreadet ConnectedThread, cela ne fait qu'ajouter à votre confusion.

Articles connexes


Patcher une méthode en dehors de la classe python

psbits Je suis intéressé par la correction d'une méthode qui est appelée par une autre méthode dans un fichier. Exemple - le fichier original.py contient - def A(): a = 10 b = 5 return a*b; def B(): c = A() return c* 10 Je veux écrire un test un