2016-09-10 3 views
0

Можно ли вызвать метод вне класса, используя существующий экземпляр? Я хочу читать данные с сенсора и пытаться отправить его через BT-соединение (уже подключенное и отправляющее другую информацию), но я не могу вызвать метод write() из «onSensorChange».Как вызвать метод вне класса

Я могу только позвонить 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

Вы не можете вызывать 'private' методы вне класса, в который они заключены ...'private' означает, что доступ к нему может получить только сам класс,' protected' позволит вам получить доступ в том же пакете, на котором вы можете посмотреть. Возможно, вам захочется узнать больше о том, как область OOP работает в Java. – px06

+0

Спасибо за быстрый ответ. Даже если я сменил все частные на публичные, произошла ошибка, которая запретила мне использовать этот метод. Может быть, я что-то упустил, я попробую еще раз проследить и следовать за вашими гидами. Благодаря! – JoeDoe

+0

Попробуйте опубликовать stacktrace после изменения области действия, чтобы мы могли понять, в чем проблема. – px06

ответ

0

Хорошо, так что несколько проблем. На самом деле, больше, чем несколько, и поэтому этот ответ вид будет повсюду (TL; DR: Сразу читать учебники и попробовать еще раз):

Прежде всего write() является private. Вместо того, чтобы объяснять, что это значит, поскольку это уже хорошо объяснено во многих местах, я предлагаю вам просто взглянуть на the official tutorial on access specifiers.

Во-вторых, даже если вы сделали это не private, у вас есть:

ConnectedThread.currentThread.write(); 

Но вы не можете сделать это по нескольким причинам. Во-первых, нет ConnectedThread.currentThread, поэтому я не буду считать, вы имели в виду ConnectThread.connectedThread, а во-вторых connectedThread является экземпляром член не является членом класса (т.е. статический), так что вам нужно фактический ConnectThread экземпляр:

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

Так что вы можете также хочу прочитать the official tutorial on class members и the official tutorial on instance members. Я также настоятельно рекомендую вам взглянуть на general write-up about variables для обзора.

Вам нужен реальный, конкретный экземпляриз более ConnectThread работать с здесь (просто делает, что статика не правильный выбор здесь, даже если он будет компилировать). Поэтому вам нужно сделать это доступным для вашего onSensorChanged() метода. К сожалению, совет теперь становится слишком широким, есть много способов скрыть эту кошку, поэтому вам действительно нужно прочитать все соответствующие официальные уроки, а затем дать ей еще один снимок с нуля.

Я скажу так: У вас есть ...

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

Здесь connectThread выходит из области видимости, как только эта функция возвращает. То есть вы создаете ConnectThread, а затем сразу бросаете любые ссылки, которые у вас есть, таким образом обрекая себя, чтобы никогда не использовать тот экземпляр, который вы только что создали. Вам не нужно этого делать. Например, вы можете сохранить его в поле участника MainActivity и получить к нему доступ.

Кстати, вы можете посмотреть, можете ли вы придумать имена двух классов, которые не похожи друг на друга, как ConnectThread и ConnectedThread, это только добавляет вам ваше замешательство.

Смежные вопросы