java - 无法在android中的最终hashmap上获得固定值

标签 java android hashmap

我正在开发一个 Android 应用程序,它使用 wifi direct 上的服务发现,基于提供的 google 示例代码,问题是我无法获得广告 TXT 记录的固定值,即使我使用的是最终的hashmap 来存储值,每次调用 onDnsSdTxtRecordAvailable 回调时都会修改 Hashmap,即使我使用全局声明的最终 hashmap 来存储第一个值,它也会被 null 替换。这是我正在使用的代码。谢谢

  private WifiP2pManager manager;

        private final IntentFilter intentFilter = new IntentFilter();
        private Channel channel;
        private BroadcastReceiver receiver = null;
        private WifiP2pDnsSdServiceRequest serviceRequest;
        private TextView statusTxtView;
        private TextView services;
        private Button register;
        private Button broadcast;
        private LocationManager locationManager;
        final HashMap<String, String> buddies = new HashMap<String, String>();
        private TextView locationTxt;
        public String value1;
        private Button loc;
        private final String name = new String();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            statusTxtView = (TextView) findViewById(R.id.status);
            services = (TextView) findViewById(R.id.services);
            register = (Button) findViewById(R.id.discover);
            broadcast = (Button) findViewById(R.id.bd);
            locationTxt = (TextView)findViewById(R.id.location);

            loc = (Button)findViewById(R.id.loc);
            intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
            intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
            intentFilter
                    .addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
            intentFilter
                    .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

            manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
            channel = manager.initialize(this, getMainLooper(), null);
            startRegistrationAndDiscovery();
            register.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startRegistrationAndDiscovery();
                }
            });

            broadcast.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    discoverService();
                }
            });

            loc.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    doIt();
                }
            });


        }


@Override
        public void onResume() {
            super.onResume();
            receiver = new MyReceiver(manager, channel, this);
            registerReceiver(receiver, intentFilter);
        }

        @Override
        public void onPause() {
            super.onPause();
            unregisterReceiver(receiver);
        }

        public void appendStatus(String status) {
            String current = statusTxtView.getText().toString();
            statusTxtView.setText(current + "\n" + status);
        }

        //service discvery handllng methods
        private void startRegistrationAndDiscovery() {
            Map<String, String> record = new HashMap<String, String>();
            record.put(TXTRECORD_PROP_AVAILABLE, "visible");
            WifiP2pDnsSdServiceInfo service = WifiP2pDnsSdServiceInfo.newInstance(
                    SERVICE_INSTANCE, SERVICE_REG_TYPE, record);
            manager.addLocalService(channel, service, new ActionListener() {

                @Override
                public void onSuccess() {
                    appendStatus("Added Local Service");
                }

                @Override
                public void onFailure(int error) {
                    appendStatus("Failed to add a service");
                }
            });

            discoverService();

        }

        private void discoverService() {
           /*
             * Register listeners for DNS-SD services. These are callbacks invoked
             * by the system when a service is actually discovered.
             */

            manager.setDnsSdResponseListeners(channel,
                    new DnsSdServiceResponseListener() {

                        @Override
                        public void onDnsSdServiceAvailable(String instanceName,
                                                            String registrationType, WifiP2pDevice srcDevice) {

                            // A service has been discovered. Is this our app?

                            if (instanceName.equalsIgnoreCase(SERVICE_INSTANCE)) {

                                // update the UI and add the item the discovered
                                // device.

                                   /* WiFiP2pService service = new WiFiP2pService();
                                    service.device = srcDevice;
                                    service.instanceName = instanceName;
                                    service.serviceRegistrationType = registrationType;*/
                                //put data to textview here
                                services.setText(srcDevice.status+" Instance name " + instanceName + " type " + registrationType);
                                Log.d(TAG, "onBonjourServiceAvailable "
                                        + instanceName);
                                Http_client http_client = new Http_client(SERVICE_INSTANCE);
                                appendStatus("data sent to server successfully");


                            }

                        }
                    }, new DnsSdTxtRecordListener() {

                        /**
                         * A new TXT record is available. Pick up the advertised
                         * buddy name.
                         */
                        @Override
                        public void onDnsSdTxtRecordAvailable(String fullDomainName, Map<String, String> record,WifiP2pDevice device) {
                            Log.d(TAG, device.deviceName + " is " + record.get(TXTRECORD_PROP_AVAILABLE));
                           buddies.put("mm",record.get(TXTRECORD_PROP_AVAILABLE));

                            Toast.makeText(getBaseContext(),record.get(TXTRECORD_PROP_AVAILABLE),Toast.LENGTH_LONG).show();
                            //
                        }
                    });

            // After attaching listeners, create a service request and initiate
            // discovery.
            serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
            manager.addServiceRequest(channel, serviceRequest,
                    new ActionListener() {

                        @Override
                        public void onSuccess() {
                            appendStatus("Added service discovery request");
                        }

                        @Override
                        public void onFailure(int arg0) {
                            appendStatus("Failed adding service discovery request");
                        }
                    });
            manager.discoverServices(channel, new ActionListener() {

                @Override
                public void onSuccess() {
                    appendStatus("Service discovery initiated");
                }

                @Override
                public void onFailure(int arg0) {
                    appendStatus("Service discovery failed");

                }
            });
        }
        public void doIt(){
            buddies.put("mm","value1");
            Toast.makeText(getBaseContext(),buddies.get("mm"),Toast.LENGTH_LONG).show();
            buddies.put("mm","value2");
            Toast.makeText(getBaseContext(),buddies.get("mm"),Toast.LENGTH_LONG).show();

        }

最佳答案

正如我所评论的,最终变量不会帮助你。根据您的问题,您需要做的是在保存新返回的变量之前始终检查 HashMap 中是否设置了该值。类似的东西

if (!buddies.containKey("mm"))
    buddies.put("mm", .....)

关于java - 无法在android中的最终hashmap上获得固定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39061021/

相关文章:

java - 错误 "Caused by: java.lang.ClassNotFoundException:"

android - 使用保留的 fragment 会导致错误膨胀 SupportMapFragment?

java - 为什么它总是说最低的数字是 Null?

java - PNG 上传时丢失 Alpha channel

java - 我得到我的 Firebase 用户 Uid 但它的 dataSnapshot 键值返回 null

java - Java SDK 和运行时的正确路径 env

java - 使用 Flink DataStream 计算窗口持续时间的平均值

android - 使用 CursorLoader 使用来自 SQLite 的数据填充 ListView

java - Android listview排序使用xml解析

java - 由于 ClassCastException 而 key 正确时无法在 Java 中打印 LinkedHasMap