访问内部类中的局部变量

时间:2021-02-13 09:22:55

标签: java android

我的 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 并且永远不会起作用!

1 个答案:

答案 0 :(得分:1)

似乎发生了这种情况,因为您试图在 MainActivity 中获取值,然后在 OnFoundNewDevice 中设置它。

换句话说,OnFoundNewDevice 会在您的 Activity 中的此日志消息之后的某个时间被调用:

Log.d("IoT Project", "Value of nodeAddress = " + MainActivity.nodeAddress);

调用 OnFoundNewDevice 后,您可以在 ClickListeners 上使用 nodeAddress 值。

相关问题