我的 MainActivity.java 文件中有以下代码:
public class MainActivity extends AppCompatActivity {
private static String nodeAddress = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Search For The NodeMCU On The Connected Network
UPnPDiscovery.discoveryDevices(this, new UPnPDiscovery.OnDiscoveryListener() {
@Override
public void OnStart() {
Log.d("UPnP Discovery", "Started Device Discovery");
}
@Override
public void OnFoundNewDevice(UPnPDevice device) {
Log.d("UPnP Discovery", "Found UPnP Device " + device.getManufacturer());
try {
if (device.getManufacturer().equals("Nobody")) {
MainActivity.nodeAddress = device.getHostAddress();
}
} catch (Exception ex) {
Log.e("ERROR", ex.getLocalizedMessage());
}
}
@Override
public void OnFinish(HashSet<UPnPDevice> devices) {
Log.d("UPnP Discovery", "Finished Searching");
TextView tv = (TextView) findViewById(R.id.connectionStatus);
tv.setText(MainActivity.nodeAddress);
}
@Override
public void OnError(Exception e) {
Log.d("UPnP Discovery", "Error While Searching For Devices");
}
});
Log.d("IoT Project", "Value of nodeAddress = " + MainActivity.nodeAddress);
// Channel 1 Event Listeners
final Button ch1OFF = findViewById(R.id.channel1Off);
final Button ch1ON = findViewById(R.id.channel1On);
final Button ch1SENSOR = findViewById(R.id.channel1Sensor);
// Channel 2 Event Listeners
final Button ch2OFF = findViewById(R.id.channel2Off);
final Button ch2ON = findViewById(R.id.channel2On);
final Button ch2SENSOR = findViewById(R.id.channel2Sensor);
// Setting Up OkHTTP To Send Requests Over The Network
OkHttpClient client = new OkHttpClient();
String ch1OffUrl = "http://" + MainActivity.nodeAddress +"/alwaysOFFOne";
String ch2OffUrl = "http://" + MainActivity.nodeAddress +"/alwaysOFFTwo";
String ch1OnUrl = "http://" + MainActivity.nodeAddress +"/alwaysONOne";
String ch2OnUrl = "http://" + MainActivity.nodeAddress +"/alwaysONTwo";
String ch1SensorUrl = "http://" + MainActivity.nodeAddress +"/sensorModeOne";
String ch2SensorUrl = "http://" + MainActivity.nodeAddress +"/sensorModeTwo";
// Setting Event Listeners For Channel 1
ch1OFF.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d("IoT Project", "Sending Request To " + ch1OffUrl);
// Building The OkHTTP Request Instance
Request request = new Request.Builder()
.url(ch1OffUrl)
.build();
// Making The HTTP Call Using The Client Instance
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String myResponse = response.body().string();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv = (TextView) findViewById(R.id.connectionStatus);
tv.setText("Channel 1 OFF");
}
});
}
}
});
}
});
}
}
我正在尝试在 UPnP Discovery 内部类之外创建一个名为 nodeAddress 的变量,并在内部类中为其分配一个值,以便我也可以在外部使用它,就像在 onclick 事件中一样。
然而,赋值仅作用于内部类,在内部类之外,它保持为 null 并且永远不会起作用!
答案 0 :(得分:1)
似乎发生了这种情况,因为您试图在 MainActivity
中获取值,然后在 OnFoundNewDevice
中设置它。
换句话说,OnFoundNewDevice
会在您的 Activity 中的此日志消息之后的某个时间被调用:
Log.d("IoT Project", "Value of nodeAddress = " + MainActivity.nodeAddress);
调用 OnFoundNewDevice
后,您可以在 ClickListeners
上使用 nodeAddress 值。